如何从字典创建2Darray?

时间:2019-05-14 12:39:18

标签: python

我有一个文件,其中包含两个因素之间的相关性,如下所示:

gr2_1 gr2_2 90%
gr2_1 gr2_3 80%
gr2_1 gr4_7 55%
gr2_2 gr3A_1 5%
gr2_2 gr3A_2 100%
gr3B_1 gr2_1 60%

我想将其转换为2D数组:

       gr2   gr3A    gr3B gr3C gr4
gr2_1  90%   none    none none 55%
gr2_2 none  5%,100%  none none none
gr2_3  65%   none     20% none none
gr3B_1 60%   none    none none none

因此,在第一列中,我将具有每个元素的名称,不再重复(列表很大)。在第一行中,各组的名称(仅5个)。如您所见,有些元素可以关联多个(通常不超过2-3个)元素。 在矩阵中,我想要两个元素之间的相关百分比。 我不在乎丢失第二个元素的ID,我只是想知道第一个元素是否存在于哪个组中以及与哪个关联相关。

我是Python的初学者,我认为我必须使用字典,而不是隔离组“ gr2”的名称并使用正则表达式,但是我没有尝试

1 个答案:

答案 0 :(得分:3)

这是一种方法。您的样本输入文件与预期输出之间存在一些差异,因此,我继续并分享了一些假设的解决方案。

import pandas as pd
# load your file into a list
l = [l.rstrip('\n').split() for l in open('my_file.txt')]
# [['gr2_1', 'gr2_2', '90%'], ['gr2_1', 'gr2_3', '80%'],...
# Construct a dataframe from it
df = pd.DataFrame(l).add_prefix('col')

    col0    col1  col2
0   gr2_1   gr2_2   90%
1   gr2_1   gr2_3   80%
2   gr2_1   gr4_7   55%
3   gr2_2  gr3A_1    5%
4   gr2_2  gr3A_2  100%
5  gr3B_1   gr2_1   60%

然后我们可以将pd.crosstab与自定义聚合函数一起使用,例如将str.cat与逗号分隔符,以将条目与公共col0col1连接起来。

我们还需要在col1列上做一些额外的工作,因为我们希望pd.crosstabgr2_2gr2_3视为相同。因此,我们可以使用str.split并对结果进行切片以保留第一项:

(pd.crosstab(index=df.col0, 
            columns=df.col1.str.split('_').str[0], 
            values = df.col2, 
            aggfunc= lambda x: x.str.cat(sep=',')))

col1        gr2     gr3A  gr4
col0                         
gr2_1   90%,80%      NaN  55%
gr2_2       NaN  5%,100%  NaN
gr3B_1      60%      NaN  NaN