pandas (Python)检查一个数据框中的一列中的字符串是否包含另一个数据框中的多列中的单词

pod7payv  于 2023-05-12  发布在  Python
关注(0)|答案(1)|浏览(168)

我有两个表,看起来像这样:
表1:
| 色谱柱A| B栏|
| --------------|--------------|
| 1|我喜欢狗|
| 二|我喜欢猫|
| 三|我喜欢狗和猫|
| 四个|猫喜欢我|
表2:
| 色谱柱C| D栏|
| --------------|--------------|
| 我|猫|
| 我|狗|
我想检查表1列中的文本是否包含表2列中的单词。新列将添加到Table 2。列E应该显示Table 1中包含同一行的列C中的单词的行的所有id号。F列应该显示Table 1中包含同一行的C列和D列中的单词的行的所有id编号。
现在我使用for-loops和iterrows()以及fnmatch来搜索这两个表。我的代码看起来像这样。

import pandas as pd

table_1_data = {'Column A': ['1', '2', '3', '4'],
        'Column B': ['I love dogs', 'I love cats', 'I love dogs and cats', 'Cats love me']}
table_1 = pd.DataFrame.from_dict(table_1_data )

 
table_2_data = {'Column C': ['I', 'me'],
        'Column D': ['cats', 'dogs']} 
table_2 = pd.DataFrame.from_dict(table_2_data )

table_2['Column E'] = ''
table_2['Column F'] = ''

for index, row in table_1.iterrows():
    
    for index2, row2 in table_2.iterrows():

        column_c = False
        column_d = False

        if len(row2['Column C']) > 0:
            if fnmatch.fnmatch(row['Column B'], '*' + row2['Column C'] + '*'):
                column_c = True

        if len(row2['Column D']) > 0:
            if fnmatch.fnmatch(row['Column B'], '*' + row2['Column D'] + '*'):
                column_d = True

        if column_c:
            table_2.at[index2, 'Column E'] = table_2.at[index2, 'Column E'] + row['Column A'] + ', '

        if column_c & column_d:
            table_2.at[index2, 'Column F'] = table_2.at[index2, 'Column F'] + row['Column A'] + ', '

print(table_2)

作为输出的表2应该如下所示
| 色谱柱C| D栏|D栏|F列|
| --------------|--------------|--------------|--------------|
| 我|猫|一二三|二三|
| 我|狗|4、||
我的代码提供了结果,但需要很长时间,因为我的Table 1有超过35000行,Table 2有超过5000行。我读到不建议在dataframe上使用循环。我想知道什么是更有效的方法来做到这一点?谢谢你提前回答。

j7dteeu8

j7dteeu81#

一种方法是将splitColumn B放入table_1中,然后将explode放入单词列表中:

words = table_1.set_index('Column A')['Column B'].str.split().explode().reset_index()
#    Column A Column B
# 0         1        I
# 1         1     love
# 2         1     dogs
# 3         2        I
# 4         2     love
# 5         2     cats
# 6         3        I
# 7         3     love
# 8         3     dogs
# 9         3      and
# 10        3     cats
# 11        4     Cats
# 12        4     love
# 13        4       me

然后,您可以将table_2Column C上的此列表合并,以查找table_1中包含Column C中的单词的所有条目:

cole = table_2.reset_index().merge(words, left_on='Column C', right_on='Column B')
#    index Column C Column D Column A Column B
# 0      0        I     cats        1        I
# 1      0        I     cats        2        I
# 2      0        I     cats        3        I
# 3      1       me     dogs        4       me

然后,cole可以在Column AColumn D上与words进一步合并,以查找table_1中包含Column C * 和 * Column D中的单词的所有条目:

colf = cole.merge(words, left_on=['Column A', 'Column D'], right_on=['Column A', 'Column B'])
#    index Column C Column D Column A Column B_x Column B_y
# 0      0        I     cats        2          I       cats
# 1      0        I     cats        3          I       cats

最后,我们可以groupbyindex列,并将Column A值与join聚合,以获得Column EColumn F的值:

table_2['Column E'] = cole.groupby('index')['Column A'].agg(','.join)
table_2['Column F'] = colf.groupby('index')['Column A'].agg(','.join)
table_2.fillna('', inplace=True)

输出:

Column C Column D Column E Column F
0        I     cats    1,2,3      2,3
1       me     dogs        4

相关问题