我想在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
答案 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)
作为替代方案,您还可以使用apply
与format
结合使用,我发现如果有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,这是我的复制代码)