The*_*era 76 python string dataframe pandas
我想在一个pandas数据帧的所述列中的每个值的开头附加一个字符串(优雅地).我已经想出了如何做到这一点,我目前正在使用:
df.ix[(df['col'] != False), 'col'] = 'str'+df[(df['col'] != False), 'col']
Run Code Online (Sandbox Code Playgroud)
这似乎是一件不公平的事情 - 你知道其他任何方式(也许这个特性也可以将字符添加到该列为0或NaN的行中)吗?
如果还不清楚,我想转向:
col
1 a
2 0
Run Code Online (Sandbox Code Playgroud)
成:
col
1 stra
2 str0
Run Code Online (Sandbox Code Playgroud)
Rom*_*kar 159
df['col'] = 'str' + df['col'].astype(str)
Run Code Online (Sandbox Code Playgroud)
例:
>>> 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
Run Code Online (Sandbox Code Playgroud)
作为替代方案,您也可以使用我发现稍微更具可读性的apply组合,format例如,如果还想添加后缀或操纵元素本身:
df = pd.DataFrame({'col':['a', 0]})
df['col'] = df['col'].apply(lambda x: "{}{}".format('str', x))
Run Code Online (Sandbox Code Playgroud)
这也产生了所需的输出:
col
0 stra
1 str0
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Python 3.6+,您还可以使用f-strings:
df['col'] = df['col'].apply(lambda x: f"str{x}")
Run Code Online (Sandbox Code Playgroud)
产生相同的输出.
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)
Run Code Online (Sandbox Code Playgroud)
format然而,使用确实要慢得多:
%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)
Run Code Online (Sandbox Code Playgroud)
小智 7
您可以使用 pandas.Series.map :
df['col'].map('str{}'.format)
Run Code Online (Sandbox Code Playgroud)
它将在所有值之前应用“str”一词。
如果您加载表文件dtype=str
或将列类型转换为字符串df['a'] = df['a'].astype(str)
,则可以使用以下方法:
df['a']= 'col' + df['a'].str[:]
Run Code Online (Sandbox Code Playgroud)
这种方法允许在df.
适用于 Pandas v0.23.4、v0.24.1。不知道早期版本。