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

时间:2017-10-04 23:48:35

标签: python string pandas numpy datetime

我有一个数据框中的列列表,我想要运行它们并对它们执行操作。列保持日期时间或没有。

对于列表中的每一列,我想修剪包含" 20"的列中的每个值。在前10个字符中,否则保持原样。

我尝试了几种方法,但却遇到了各种各样的错误或不完美的结果。

以下版本会引发错误" ' STR'对象没有属性' apply'",但如果我不使用" .astype(str)",那么我会收到"的错误类型' datetime.datetime'的参数是不可迭代的#34;。

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。提前谢谢。

2 个答案:

答案 0 :(得分:3)

循环被认为是大熊猫的憎恶。我推荐使用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])

答案 1 :(得分:3)

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