我有两个数据框:
dfA
Alpha Beta Gamma
1 apple bana
1 gin vodka
dfB
Teta heta hofa
1 apple bana
1 apple vodka
如何找到具有最大匹配实体数的列对?对于两列,进行合并或使用集非常容易,我是否需要为此编写一个for循环?
我还尝试了:dfA.where(dfA.values==dfB.values).notna()
导致ValueError: Array conditional must be same shape as self
。
我想要的结果是:
Columns Nr
(Alpha, Teta) 2
(Alpha, heta) 0
(Alpha, hofa) 0
(Beta, Teta) 0
(Beta, heta) 1
(Beta, hofa) 0
(Gamma, Teta) 0
(Gamma, heta) 0
(Gamma, hofa) 2
背景:我必须检查两个系统的条目是否匹配,但是不幸的是,这些系统使用的是不同的命名,并且我需要标识前几列。
答案 0 :(得分:2)
在两个元组的列表理解中使用两个product
名称中的columns
,按Series.isin
测试成员资格,按True
计数sum
个,对元组进行列表理解,然后传递给{{ 1}}构造函数:
DataFrame
对于输出中的3列非常相似的解决方案:
from itertools import product
L = [((a, b), dfA[a].isin(dfB[b]).sum()) for a, b in product(dfA.columns, dfB.columns)]
df = pd.DataFrame(L, columns=['Columns','Nr'])
print (df)
Columns Nr
0 (Alpha, Teta) 2
1 (Alpha, heta) 0
2 (Alpha, hofa) 0
3 (Beta, Teta) 0
4 (Beta, heta) 1
5 (Beta, hofa) 0
6 (Gamma, Teta) 0
7 (Gamma, heta) 0
8 (Gamma, hofa) 2