繁体   English   中英

从pandas DataFrame中的多个字符串列中删除子字符串

[英]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.findnp.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM