提问人:datascientistxxx 提问时间:5/31/2023 更新时间:5/31/2023 访问量:34
字符串匹配项为空,尽管字符串包含在列中
string matches are empty although string is contained in column
问:
我有两个数据帧:一个数据帧 df,其中一列包含文本数据,另一个数据帧econ_terms有两列包含正负经济术语。
我想删除所有不包含“积极”或“消极”经济术语字符串的文本行
# Convert the column to a string
df['text'] = df['text'].astype(str)
econ_terms['plus'] = econ_terms['plus'].astype(str)
econ_terms['minus'] = econ_terms['minus'].astype(str)
# Get the unique values from 'plus' and 'minus' columns in the 'econ_terms' DataFrame
econ_values = set(econ_terms['plus']).union(set(econ_terms['minus']))
# Filter the 'df' DataFrame using boolean indexing
df_filtered = df[df['text'].isin(econ_values)]
“minus”列包含诸如“失业”之类的词,在手动浏览数据时,该词显然位于“文本”列中。
但是,df_filtered显示一个空数据帧。这可能是什么原因?
答:
1赞
Geom
5/31/2023
#1
你正在描述一件事,但你的代码正在做一件完全不同的事情。
你想搜索“text”是否包含“plus”和“minus”的术语,但你要检查“text”是否包含在“plus”和“minus”中。此示例说明了该问题:
import pandas as pd
d = {'text': ['equally good_value', 'bad_value', 'good_value']}
df = pd.DataFrame(data=d)
d = {'plus': ['good_value', 'more_values'], 'minus': ['good_value', 'some_other_value']}
econ_values = pd.DataFrame(data=d)
df['text'] = df['text'].astype(str)
econ_values['plus'] = econ_values['plus'].astype(str)
econ_values['minus'] = econ_values['minus'].astype(str)
econ_values = set(econ_values['plus']).union(set(econ_values['minus']))
df_filtered = df[df['text'].isin(econ_values)]
print(df_filtered)
输出:
text
2 good_value
请注意“同样good_value”是如何消失的,因为它不在“加号”和“减号”中,即使它包含“good_value”。
您需要反其道而行之:
import pandas as pd
d = {'text': ['equally good_value', 'bad_value', 'good_value']}
df = pd.DataFrame(data=d)
d = {'plus': ['good_value', 'more_values'], 'minus': ['good_value', 'some_other_value']}
econ_values = pd.DataFrame(data=d)
df['text'] = df['text'].astype(str)
econ_values['plus'] = econ_values['plus'].astype(str)
econ_values['minus'] = econ_values['minus'].astype(str)
econ_values = set(econ_values['plus']).union(set(econ_values['minus']))
def search_text(row):
match_count = 0
for term in econ_values:
if term in row:
match_count +=1
if match_count > 0:
return True
else:
return False
df['contains'] = df['text'].apply(lambda row: search_text(row))
输出:
text contains
0 equally good_value True
1 bad_value False
2 good_value True
然后,您可以筛选行:
df_filtered = df.loc[df['contains']==True]
print(df_filtered)
输出:
text contains
0 equally good_value True
2 good_value True
上面的示例反转了搜索。它检查“加号”和“减号”是否在“文本”中,而不是相反。
-1赞
Muthu Vijay
5/31/2023
#2
您的代码是正确的!它非常适合我。这是我尝试过的示例代码。
import pandas as pd
data1 = {
'text': [9, 10, 3, 4],
}
data2 = {
'plus': [1, 2, 5, 6],
'minus': [3, 4, 7, 8]
}
df = pd.DataFrame(data1)
econ_terms = pd.DataFrame(data2)
df['text'] = df['text'].astype(str)
econ_terms['plus'] = econ_terms['plus'].astype(str)
econ_terms['minus'] = econ_terms['minus'].astype(str)
print(type(df['text'][0]))
econ_values = set(econ_terms['plus']).union(set(econ_terms['minus']))
print(econ_values)
df_filtered = df[df['text'].isin(econ_values)]
print(df_filtered)
输出:
a b
2 3 7
3 4 8
评论