我有两个表,看起来像这样:
表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上使用循环。我想知道什么是更有效的方法来做到这一点?谢谢你提前回答。
1条答案
按热度按时间j7dteeu81#
一种方法是将
split
Column B
放入table_1
中,然后将explode
放入单词列表中:然后,您可以将
table_2
与Column C
上的此列表合并,以查找table_1
中包含Column C
中的单词的所有条目:然后,
cole
可以在Column A
和Column D
上与words
进一步合并,以查找table_1
中包含Column C
* 和 *Column D
中的单词的所有条目:最后,我们可以
groupby
index
列,并将Column A
值与join
聚合,以获得Column E
和Column F
的值:输出: