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

时间:2013-11-17 00:56:09

标签: python string pandas dataframe

我想在pandas数据帧的所述列中的每个值的开头附加一个字符串(优雅地)。 我已经想出了如何做到这一点,我目前正在使用:

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

这似乎是一件不起眼的事情 - 你知道其他任何方式吗(也许还会将字符添加到该列为0或NaN的行中)?

如果目前尚不清楚,我想转:

    col 
1     a
2     0

成:

       col 
1     stra
2     str0

6 个答案:

答案 0 :(得分:129)

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

答案 1 :(得分:8)

作为替代方案,您还可以使用applyformat结合使用,我发现如果有df = pd.DataFrame({'col':['a', 0]}) df['col'] = df['col'].apply(lambda x: "{}{}".format('str', x)) 还想添加后缀或操纵元素本身:

    col
0  stra
1  str0

也产生了所需的输出:

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

如果您使用的是Python 3.6+,还可以使用f-strings:

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)

产生相同的输出。

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

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) 确实要慢得多:

String response = new Gson().toJson(listSchema);
 BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\Users\\Desktop\\file.json"));
      writer.write(response);
      writer.close();

答案 2 :(得分:1)

您可以使用pandas.Series.map:

df['col'].map('str{}'.format)

它将在所有值之前加上“ str”一词。

答案 3 :(得分:0)

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

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

此方法允许df的前缀,附加和子集字符串。
适用于Pandas v0.23.4,v0.24.1。不知道较早的版本。

答案 4 :(得分:0)

.loc的另一种解决方案:

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

这没有上面的解决方案快(每个循环慢1ms),但是在需要条件更改时可能有用,例如:

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

答案 5 :(得分:0)

在控制 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,这是我的复制代码)

相关问题