这是一个预处理的DataFrame,其中的列表示特定列的频率和成功值。例如:列A
分别与FREQ_A
和SUCCESS_A
相关联。
A B Gold FREQ_A SUCCESS_A FREQ_B SUCCESS_B
0 1 B 0 1 0.00 1 0.00
1 2 A 1 1 0.01 1 0.01
我有另一个DataFrame,如下所示:
A B
0 1 A
1 2 B
现在,我想添加关联的频率和成功列(FREQ_*
和SUCCESS_*
,* : {A,B}
),查找预处理的DataFrame中的值。一个重要的观察是预处理的DataFrame具有相同的一组(非freq / success)列,但不是一组完整的键。 (请参阅行2
,A:3
和B:C
不在预处理框架中)
例如:
数据框中的第一行的值为A = 1, B = A
,因此:
FREQ_A
将获取FREQ_A
的原始数据框的值A == 1
和
FREQ_B
将获取FREQ_B
的原始数据框的值B == A
理想输出
A B FREQ_A SUCCESS_A FREQ_B SUCCESS_B
0 1 A 1 0.00 1 0.01
1 2 B 1 0.01 1 0.00
测试用例
A B
0 1 A
1 2 B
2 1 C
3 4 A
答案 0 :(得分:1)
df1 = pd.DataFrame({
'A': [1, 2],
'B': ['B', 'A'],
'FREQ_A': [1, 1],
'FREQ_B': [1, 1],
'Gold': [0, 1],
'SUCCESS_A': [0.0, 0.01],
'SUCCESS_B': [0.0, 0.01]})
df2 = pd.DataFrame({'A': [1, 2], 'B': ['A', 'B']})
result = (df2
.merge(df1[['A', 'FREQ_A', 'SUCCESS_A']], on='A')
.merge(df1[['B', 'FREQ_B', 'SUCCESS_B']], on='B'))
>>> result
A B FREQ_A SUCCESS_A FREQ_B SUCCESS_B
0 1 A 1 0.00 1 0.01
1 2 B 1 0.01 1 0.00
修改强>
对于任意数据帧:
result = pd.concat(
[df2, pd.concat([df2[[col]].merge(
df1[[col, 'FREQ_' + str(col), 'SUCCESS_' + str(col)]],
on=col, how='left').iloc[:, 1:]
for col in df2], axis=1)],
axis=1)