![](/img/trans.png)
[英]Remove substring from pandas dataframe if it contain digit
[英]Remove substring from multiple string columns in a pandas DataFrame
我有一个要在其中运行并对其执行操作的数据框中的列的列表。 这些列保存日期时间或什么都不保存。
对于列表中的每一列,我想将其中包含“ 20”的列中的每个值修剪为前10个字符,否则将其保留原样。
我已经尝试了几种方法,但是会遇到各种错误或不完善的结果。
以下版本引发错误:“'str'对象没有属性'apply'”,但是如果我不使用“ .astype(str)”,那么我会收到“类型为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])
HALP。 提前致谢。
循环被认为是大熊猫中的可憎之物。 我建议只使用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])
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.