pandas 如何基于 Dataframe 计算两两共生矩阵?

owfi6suc  于 2022-12-02  发布在  其他
关注(0)|答案(2)|浏览(109)

我有一个 Dataframe ,大约有800,000行和16列,下面是一个数据示例,

import pandas as pd
import datetime

start = datetime.datetime.now()
print('Starting time,'+str(start))
dict1 = {'id':['person1','person2','person3','person4','person5'], \
         'food1':['A','A','A','C','D' ], \
         'food2':['B','C','B','A','B'], \
         'food3':['','D','C','',''], 'food4':['','','D','','',] }
demo = pd.DataFrame(dict1)
demo

>>>Out[13]
Starting time,2022-11-30 12:08:41.414807

      id     food1  food2   food3   food4
0   person1    A      B     
1   person2    A      C       D 
2   person3    A      B       C       D
3   person4    C      A     
4   person5    D      B

我理想结果格式如下:

>>>Out[14]

    A   B   C   D       
A   0   2   3   2
B   2   0   1   2
C   3   1   0   2
D   2   2   2   0

我执行了以下操作:
我在stackoverflow和google上搜索了一下,但到目前为止还没有找到一个能解决我问题的答案。
我自己也尝试过编码,我的想法是先建立每一对,然后把所有的组合成一个字符串,最后找到重复的数量,但受限于我的编码能力,这是一项正在进行中的工作。而且,一对中的下一个和另一对中的上一个的“新”组合可能会在寻找重复的过程中导致错误。
谢谢你的帮助。

nbysray5

nbysray51#

您可以尝试以下操作:

out = demo.iloc[:,1:].stack().str.get_dummies().sum(level=0).ne(0).astype(int)
final = out.T.dot(out).astype(float)
np.fill_diagonal(final.values, np.nan)

>>>final
    A   B   C   D
A   NaN 2.0 3.0 2.0
B   2.0 NaN 1.0 2.0
C   3.0 1.0 NaN 2.0
D   2.0 2.0 2.0 NaN
oipij1gg

oipij1gg2#

如果我正确理解了您的目标,您可以使用以下命令:

uniques = demo[[x for x in demo.columns if 'id' not in x]].stack().unique()
pd.DataFrame(index = uniques, columns = uniques).fillna(np.NaN)

相关问题