从 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.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

【讨论】:

以上是关于从 pandas DataFrame 中的多个字符串列中删除子字符串的主要内容,如果未能解决你的问题,请参考以下文章

从多个dicts创建一个pandas DataFrame [重复]

从pandas DataFrame中另一列中的位置给定的字符串列中提取字符[重复]

从 pandas DataFrame 中的文本中提取子字符串作为新列

如何从列类型列表中删除 pandas DataFrame 中的空值

如何编辑多个 Pandas DataFrame 浮点列的字符串格式?

pandas从dataframe中删除一个或多个数据列