我想在熊猫数据框架的一个列中(优雅地)附加一个字符串到每个值的开始。
我已经知道如何做到这一点,我目前正在使用:
df.ix[(df['col'] != False), 'col'] = 'str'+df[(df['col'] != False), 'col']
这似乎是一件非常不优雅的事情——你知道其他方法吗(可能也会将字符添加到列为0或NaN的行中)?
如果这一点还不清楚,我想谈谈:
col
1 a
2 0
成:
col
1 stra
2 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)