在两个数据帧之间找到相等的列

OD1*_*995 18 python python-3.x pandas

我有两个pandas数据框,a并且b

a1   a2   a3   a4   a5   a6   a7
1    3    4    5    3    4    5
0    2    0    3    0    2    1
2    5    6    5    2    1    2
Run Code Online (Sandbox Code Playgroud)

b1   b2   b3   b4   b5   b6   b7
3    5    4    5    1    4    3
0    1    2    3    0    0    2
2    2    1    5    2    6    5
Run Code Online (Sandbox Code Playgroud)

这两个数据框包含完全相同的数据,但顺序不同,列名也不同。根据两个数据框中的数字,我希望能够a将每个列名与b.

这并不像简单地将 的第一行a与第一行进行比较那么容易,b因为存在重复的值,例如两者a4a7都有值,5因此不可能立即将它们与b2或匹配b4

做这个的最好方式是什么?

yat*_*atu 18

这是利用广播来检查两个数据帧之间的相等性并采用all结果来检查所有行在哪里匹配的一种方法。然后我们可以从np.where (@piR 的贡献)的结果中获得两个数据帧列名的索引数组:

i, j = np.where((a.values[:,None] == b.values[:,:,None]).all(axis=0))
dict(zip(a.columns[j], b.columns[i]))
# {'a7': 'b2', 'a6': 'b3', 'a4': 'b4', 'a2': 'b7'}
Run Code Online (Sandbox Code Playgroud)


ank*_*_91 16

这是一种使用方法sort_values

m=df1.T.sort_values(by=[*df1.index]).index
n=df2.T.sort_values(by=[*df2.index]).index
d=dict(zip(m,n))
print(d)
Run Code Online (Sandbox Code Playgroud)
{'a1': 'b5', 'a5': 'b1', 'a2': 'b7', 'a3': 'b6', 'a6': 'b3', 'a7': 'b2', 'a4': 'b4'}
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 12

一种方式 merge

s=df1.T.reset_index().merge(df2.T.assign(match=lambda x : x.index))
dict(zip(s['index'],s['match']))
{'a1': 'b5', 'a2': 'b7', 'a3': 'b6', 'a4': 'b4', 'a5': 'b1', 'a6': 'b3', 'a7': 'b2'}
Run Code Online (Sandbox Code Playgroud)


piR*_*red 8

字典理解

使用tuple列值中的一个作为字典中的可散列键

d = {(*t,): c for c, t in df2.items()}
{c: d[(*t,)] for c, t in df1.items()}

{'a1': 'b5',
 'a2': 'b7',
 'a3': 'b6',
 'a4': 'b4',
 'a5': 'b1',
 'a6': 'b3',
 'a7': 'b2'}
Run Code Online (Sandbox Code Playgroud)

以防万一我们没有完美的表示,我只为有匹配的列生成了字典。

d2 = {(*t,): c for c, t in df2.items()}
d1 = {(*t,): c for c, t in df1.items()}

{d1[c]: d2[c] for c in {*d1} & {*d2}}

{'a5': 'b1',
 'a2': 'b7',
 'a7': 'b2',
 'a6': 'b3',
 'a3': 'b6',
 'a1': 'b5',
 'a4': 'b4'}
Run Code Online (Sandbox Code Playgroud)

idxmax

这几乎是荒谬的......实际上不要这样做。

{c: df2.T.eq(df1[c]).sum(1).idxmax() for c in df1}

{'a1': 'b5',
 'a2': 'b7',
 'a3': 'b6',
 'a4': 'b4',
 'a5': 'b1',
 'a6': 'b3',
 'a7': 'b2'}
Run Code Online (Sandbox Code Playgroud)