使用Pandas为字符串列中的每个值添加一个字符串前缀

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)

  • 当我尝试此方法以及任何其他方法时,我会收到SettingWithCopyWarning。有办法避免吗? (7认同)
  • 谢谢。如果感兴趣的话,数据帧索引也支持此类字符串操作。 (2认同)
  • 如果在串联之前必须满足条件,我该怎么做? (2认同)

Cle*_*leb 9

作为替代方案,您也可以使用我发现稍微更具可读性的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)

  • @Philipp_Kats:我添加了一些计时,感谢您的建议!看起来 f 弦几乎一样快;`format` 确实表现更差。你比较得如何? (2认同)

小智 7

您可以使用 pandas.Series.map :

df['col'].map('str{}'.format)
Run Code Online (Sandbox Code Playgroud)

它将在所有值之前应用“str”一词。


Vas*_*kyi 6

如果您加载表文件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。不知道早期版本。