我想在熊猫数据框架的一个列中(优雅地)附加一个字符串到每个值的开始。 我已经知道如何做到这一点,我目前正在使用:

df.ix[(df['col'] != False), 'col'] = 'str'+df[(df['col'] != False), 'col']

这似乎是一件非常不优雅的事情——你知道其他方法吗(可能也会将字符添加到列为0或NaN的行中)?

如果这一点还不清楚,我想谈谈:

    col 
1     a
2     0

成:

       col 
1     stra
2     str0

当前回答

如果你用dtype=str加载你的表文件 或转换列类型为字符串df['a'] = df['a'].astype(str) 那么你可以使用这样的方法:

df['a']= 'col' + df['a'].str[:]

这种方法允许对df的字符串进行前置、追加和子集操作。 工作在Pandas v0.23.4, v0.24.1。不知道更早的版本。

其他回答

df['col'] = 'str' + df['col'].astype(str)

例子:

>>> df = pd.DataFrame({'col':['a',0]})
>>> df
  col
0   a
1   0
>>> df['col'] = 'str' + df['col'].astype(str)
>>> df
    col
0  stra
1  str0

作为另一种选择,你也可以使用apply结合format(或者更好的f-strings),我发现如果一个人还想添加一个后缀或操作元素本身,它的可读性稍好:

df = pd.DataFrame({'col':['a', 0]})

df['col'] = df['col'].apply(lambda x: "{}{}".format('str', x))

这也产生了期望的输出:

    col
0  stra
1  str0

如果你正在使用Python 3.6+,你也可以使用f-strings:

df['col'] = df['col'].apply(lambda x: f"str{x}")

产生相同的输出。

f-string版本几乎和@RomanPekar的解决方案一样快(python 3.6.4):

df = pd.DataFrame({'col':['a', 0]*200000})

%timeit df['col'].apply(lambda x: f"str{x}")
117 ms ± 451 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit 'str' + df['col'].astype(str)
112 ms ± 1.04 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

然而,使用格式确实要慢得多:

%timeit df['col'].apply(lambda x: "{}{}".format('str', x))
185 ms ± 1.07 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

如果你用dtype=str加载你的表文件 或转换列类型为字符串df['a'] = df['a'].astype(str) 那么你可以使用这样的方法:

df['a']= 'col' + df['a'].str[:]

这种方法允许对df的字符串进行前置、追加和子集操作。 工作在Pandas v0.23.4, v0.24.1。不知道更早的版本。

在控制nan(例如csv导出中人类可读的值)时,为列添加前缀。

“_”+ df[‘col1’],replace(np.nan), astype(str)

例子:

import sys
import platform
import pandas as pd
import numpy as np

print("python {}".format(platform.python_version(), sys.executable))
print("pandas {}".format(pd.__version__))
print("numpy {}".format(np.__version__))

df = pd.DataFrame({
    'col1':["1a","1b","1c",np.nan],
    'col2':["2a","2b",np.nan,"2d"], 
    'col3':[31,32,33,34],
    'col4':[np.nan,42,43,np.nan]})

df['col1_prefixed'] = "_" + df['col1'].replace(np.nan,'no value').astype(str)
df['col4_prefixed'] = "_" + df['col4'].replace(np.nan,'no value').astype(str)

print(df)
python 3.7.3
pandas 1.2.3
numpy 1.18.5
  col1 col2  col3  col4 col1_prefixed col4_prefixed
0   1a   2a    31   NaN           _1a     _no value
1   1b   2b    32  42.0           _1b         _42.0
2   1c  NaN    33  43.0           _1c         _43.0
3  NaN   2d    34   NaN     _no value     _no value

(对不起,冗长,我发现这个Q在一个不相关的列类型问题上工作,这是我的复制代码)

使用.loc的另一个解决方案:

df = pd.DataFrame({'col': ['a', 0]})
df.loc[df.index, 'col'] = 'string' + df['col'].astype(str)

这没有上面的解决方案那么快(>每循环慢1ms),但在你需要条件更改的情况下可能是有用的,比如:

mask = (df['col'] == 0)
df.loc[mask, 'col'] = 'string' + df['col'].astype(str)