python - 替换数据框中不包含特定单词的所有元素

python - Substitute all elements in a dataframe that don't contain certain words

我有一个非常大的数据框,我想用 NaN 替换所有不包含特定单词的元素(同时保持第一个“id”列不变)。

例如:

index  id    text1                        text2                        ...
1      123   {'"key'": '"living_space'"   '"value'": '"01.04.2022'"}   ...
2      124   {'"key'": '"rooms'"          '"value'": '"3'"}            ...
3      125   23                           {'"key'": '"rooms'"          ...
4      126   45                           Apartment sold               ...

我想保留数据框中包含单词 keyvalue 的所有元素,并将所有其他元素替换为 nan,所以我会得到一个像这样的数据框:

index  id    text1                        text2                        ...
1      123   {'"key'": '"living_space'"   '"value'": '"01.04.2022'"}   ...
2      124   {'"key'": '"rooms'"          '"value'": '"3'"}            ...
3      125   nan                          {'"key'": '"rooms'"          ...
4      126   nan                          nan                          ...

我试过使用下面的代码,但它只是清除了整个数据集。

l1 = ['key', 'value']
df.iloc[:,1:] = df.iloc[:,1:].applymap(lambda x: x if set(x.split()).intersection(l1) else '')

提前致谢。

考虑以下方法来解决问题。它由两部分组成。 (1) 决定是否保留或擦除数据的逻辑在函数 substring_filter 中实现 - 我们只是检查 target 字符串是否包含来自 words 的任何单词。 (2) 实际过滤是使用 np.where 执行的 - 来自 numpy 的非常方便的辅助函数。

import numpy as np
import pandas as pd


def substring_filter(target, words):
    for word in words:
        if word in target:
            return True
    return False


if __name__ == '__main__':

    df = pd.DataFrame({
        'A': [1, 2, 3, 4],
        'B': [True, False, False, True],
        'C': ['{"key": 1}', '{"value": 2}', 'text', 'abc']})

    words_to_search = ('key', 'value')
    df.loc[:, 'C'] = np.where(
        df.loc[:, 'C'].apply(lambda x: substring_filter(x, words_to_search)),
        df.loc[:, 'C'],
        None)
    print(df)

结果是:

   A      B             C
0  1   True    {"key": 1}
1  2  False  {"value": 2}
2  3  False          None
3  4   True          None