从 pandas DataFrame 中的多个字符串列中删除子字符串
Posted
技术标签:
【中文标题】从 pandas DataFrame 中的多个字符串列中删除子字符串【英文标题】:Remove substring from multiple string columns in a pandas DataFrame 【发布时间】:2018-03-16 11:50:34 【问题描述】:我有一个数据框中的列列表,我想遍历这些列并对它们执行操作。这些列包含日期时间或什么都没有。
对于列表中的每一列,我想将列中包含“20”的每个值修剪为前 10 个字符,否则保持原样。
我已经尝试了几种方法,但得到了各种错误或不完美的结果。
以下版本会抛出“'str' object has no attribute 'apply'”的错误,但如果我不使用“.astype(str)”,则会收到“argument of type 'datetime”的错误.datetime' 不可迭代”。
df_combined[dateColumns] = df_combined[dateColumns].fillna(notFoundText).astype(str)
print (dateColumns)
for column in dateColumns:
for row in range(len(column)):
print(df_combined[column][row])
if "20" in (df_combined[column][row]):
df_combined[column][row].apply(lambda x: x[:10], axis=1)
print(df_combined[column][row])
停下来。提前致谢。
【问题讨论】:
【参考方案1】:循环在 Pandas 中被认为是可憎的。我建议只做这样的事情,str.contains
+ np.where
。
for c in df.columns:
# df[c] = df[c].astype(str) # uncomment this if your columns aren't dtype=str
df[c] = np.where(df[c].str.contains("20"), df[c].str[:10], df[c])
【讨论】:
【参考方案2】:IIUC:
您希望对整个数据框执行此操作。
如果是这样,这是一种在整个数据帧上同时使用numpy
的矢量化方式。
设置
df = pd.DataFrame([
['xxxxxxxx20yyyy', 'z' * 14, 'wwwwwwww20vvvv'],
['k' * 14, 'dddddddd20ffff', 'a' * 14]
], columns=list('ABC'))
df
A B C
0 xxxxxxxx20yyyy zzzzzzzzzzzzzz wwwwwwww20vvvv
1 kkkkkkkkkkkkkk dddddddd20ffff aaaaaaaaaaaaaa
解决方案
使用numpy.core.defchararray.find
和np.where
from numpy.core.defchararray import find
v = df.values.astype(str)
i, j = np.where(find(v, '20') > -1)
v[i, j] = v[i, j].astype('<U10')
df.loc[:] = v
df
A B C
0 xxxxxxxx20 zzzzzzzzzzzzzz wwwwwwww20
1 kkkkkkkkkkkkkk dddddddd20 aaaaaaaaaaaaaa
如果不想覆盖旧数据框,可以新建一个:
pd.DataFrame(v, df.index, df.columns)
A B C
0 xxxxxxxx20 zzzzzzzzzzzzzz wwwwwwww20
1 kkkkkkkkkkkkkk dddddddd20 aaaaaaaaaaaaaa
【讨论】:
以上是关于从 pandas DataFrame 中的多个字符串列中删除子字符串的主要内容,如果未能解决你的问题,请参考以下文章
从多个dicts创建一个pandas DataFrame [重复]
从pandas DataFrame中另一列中的位置给定的字符串列中提取字符[重复]
从 pandas DataFrame 中的文本中提取子字符串作为新列
如何从列类型列表中删除 pandas DataFrame 中的空值