字符串匹配项为空,尽管字符串包含在列中

string matches are empty although string is contained in column

提问人:datascientistxxx 提问时间:5/31/2023 更新时间:5/31/2023 访问量:34

问:

我有两个数据帧:一个数据帧 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显示一个空数据帧。这可能是什么原因?

python nlp isin

评论


答:

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