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 ...
我想保留数据框中包含单词 key 或 value 的所有元素,并将所有其他元素替换为 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
我有一个非常大的数据框,我想用 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 ...
我想保留数据框中包含单词 key 或 value 的所有元素,并将所有其他元素替换为 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