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因为存在重复的值,例如两者a4和a7都有值,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)
使用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)
| 归档时间: |
|
| 查看次数: |
848 次 |
| 最近记录: |