我有一个文件,其中包含两个因素之间的相关性,如下所示:
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”的名称并使用正则表达式,但是我没有尝试
答案 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
与逗号分隔符,以将条目与公共col0
和col1
连接起来。
我们还需要在col1
列上做一些额外的工作,因为我们希望pd.crosstab
将gr2_2
和gr2_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