在python中将列值分组到稀疏矩阵

2024-06-01 09:29:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据:

User    Group
user1   G1
user1   G2
user1   G3
user1   G7
user2   G10
user2   G4
user2   G7
user2   G1
user2   G13
user3   G16
user3   G5
user3   G6
user4   G2
user4   G13
user4   G15
user4   G10

我想以以下格式准备相关数据:

       G1  G2 G3 G4 G5 G6 G7 G10 G13 G15 G16
user1  1   1  1  0  0  0  1  0   0   0   0  
user2  1   0  0  1  0  0  1  1   1   0   0
user3  0   0  0  0  1  1  0  0   1   0   1
user4  0   1  0  0  0  0  0  1   1   1   0

我试着分别转置每个用户,但这对我没有帮助。 有没有办法做这项工作,因为我有更大的数据。我知道它将创建一个解析矩阵,但这正是我想要创建的


Tags: 数据g4g1user1g2g7user2g6
2条回答

您可以使用pandas.crosstab并传递索引和列参数

>>> pd.crosstab(df['User'], df['Group'])

Group  G1  G10  G13  G15  G16  G2  G3  G4  G5  G6  G7
User                                                 
user1   1    0    0    0    0   1   1   0   0   0   1
user2   1    1    1    0    0   0   0   1   0   0   1
user3   0    0    0    0    1   0   0   0   1   1   0
user4   0    1    1    1    0   1   0   0   0   0   0

如果希望列以预期输出中的排序方式显示,可以稍后在crosstab之后对列进行排序(对初始数据帧的Group列进行排序也可以,但会影响性能):

>>> out = pd.crosstab(df['User'], df['Group'])
>>> out[sorted(out.columns, key= lambda x: int(''.join(i for i in x if i.isdigit())))]

Group  G1  G2  G3  G4  G5  G6  G7  G10  G13  G15  G16
User                                                 
user1   1   1   1   0   0   0   1    0    0    0    0
user2   1   0   0   1   0   0   1    1    1    0    0
user3   0   0   0   0   1   1   0    0    0    0    1
user4   0   1   0   0   0   0   0    1    1    1    0

作为对另一个答案的补充,您可以使用自然排序与natsort

from natsort import natsorted
df2 = pd.crosstab(df['User'], df['Group'])
df2[natsorted(df2.columns)]

输出:

Group  G1  G2  G3  G4  G5  G6  G7  G10  G13  G15  G16
User                                                 
user1   1   1   1   0   0   0   1    0    0    0    0
user2   1   0   0   1   0   0   1    1    1    0    0
user3   0   0   0   0   1   1   0    0    0    0    1
user4   0   1   0   0   0   0   0    1    1    1    0

相关问题 更多 >