python-3.x - 使用数据帧作为另一个数据帧的查找

标签 python-3.x pandas dataframe lookup-tables

我有两个数据帧 df_1df_2

df_1 是我的主数据帧,df_2 是查找数据帧。

我想测试 df_1['col_c1'] 中的值是否包含 df_2['col_a2'] 中的任何值。
如果这是真的(可以是多个匹配!);

  • df_2['col_b2'] 中的值添加到 df_1['col_d1']
  • df_2['col_c2'] 中的值添加到 df_1['col_e1']

我怎样才能实现这个目标?
我真的不知道,因此我无法为此分享任何代码。

示例df_1

col_a1 | col_b1 | col_c1         | col_d1 | col_e1
----------------------------------------------------
1_001  | aaaaaa | bbbbccccdddd   |        | 
1_002  | zzzzz  | ggggjjjjjkkkkk |        | 
1_003  | pppp   | qqqqffffgggg   |        | 
1_004  | sss    | wwwcccyyy      |        |
1_005  | eeeeee | eecccffffll    |        |
1_006  | tttt   | hhggeeuuuuu    |        |

示例df_2

col_a2 | col_b2 | col_c2
------------------------------
ccc    | 2_001  | some_data_c
jjj    | 2_002  | some_data_j
fff    | 2_003  | some_data_f

所需输出df_1

col_a1 | col_b1 | col_c1         | col_d1       | col_e1
------------------------------------------------------------------------------
1_001  | aaaaaa | bbbbccccdddd   | 2_001        | some_data_c
1_002  | zzzzz  | ggggjjjjjkkkkk | 2_002        | some_data_j
1_003  | pppp   | qqqqffffgggg   | 2_003        | some_data_f
1_004  | sss    | wwwcccyyy      | 2_001        | some_data_c
1_005  | eeeeee | eecccffffll    | 2_001;2_003  | some_data_c; some_data_f
1_006  | tttt   | hhggeeuuuuu    |              |

df_1 大约有 45.000 行,df_2 大约有 45.000 行。 16.000 行。 (还添加了不匹配的行)

我已经为此苦苦挣扎了几个小时,但我真的不知道。
我不认为合并是一种选择,因为没有完全匹配。
非常感谢您的帮助。

最佳答案

用途:

#exctract values by df_2["col_a2"] to new column
s = (df_1['col_c1'].str.extractall(f'({"|".join(df_2["col_a2"])})')[0].rename('new')
                   .reset_index(level=1, drop=True))

#repeat rows with duplicated match
df_1 = df_1.join(s)
#add new columns by map
df_1['col_d1'] = df_1['new'].map(df_2.set_index('col_a2')['col_b2'])
df_1['col_e1'] = df_1['new'].map(df_2.set_index('col_a2')['col_c2'])
#aggregate join
cols = df_1.columns.difference(['new','col_d1','col_e1']).tolist()
df = df_1.drop('new', axis=1).groupby(cols).agg(','.join).reset_index()

print (df)
  col_a1  col_b1          col_c1       col_d1                   col_e1
0  1_001  aaaaaa    bbbbccccdddd        2_001              some_data_c
1  1_002   zzzzz  ggggjjjjjkkkkk        2_002              some_data_j
2  1_003    pppp    qqqqffffgggg        2_003              some_data_f
3  1_004     sss       wwwcccyyy        2_001              some_data_c
4  1_005  eeeeee     eecccffffll  2_001,2_003  some_data_c,some_data_f

关于python-3.x - 使用数据帧作为另一个数据帧的查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57090205/

相关文章:

python - 为什么 PyCharm 中 numpy 的范围显示精度错误?

python - 如何获取重新采样的 DataFrame 中每个时间帧的最后一个元素?

python - 如何将数据帧的某一列合并到另一列?

R对连续的重复行求和并删除除第一个以外的所有行

python - 如何计算 pygame.Surface 的屏幕中间?

python - 在 ipdb session 中如何使用 list()?

python - Dask DataFrame Groupby : Most frequent value of column in aggregate

python - Pandas 在 DatetimeIndex TypeError : object of type 'NoneType' has no len() 上合并

python - Pandas - 在计算中跳过 NULL 值

python - 哈希表模拟