我在将一列的值组合在一起并保留其他列的各自值时遇到了麻烦。我想做类似的事情:grouping rows in list in pandas groupby
但相反,我希望列表/字典(最好是后者)包含多列的值。 此数据框的示例:
df:
Col1 Col2 Col3
A xyz 1
A pqr 2
B xyz 2
B pqr 3
B lmn 1
C pqr 2
我想要类似的东西-
A {'xyz':1, 'pqr': 2}
B {'xyz':2, 'pqr': 3, 'lmn': 1}
C {'pqr':2}
我试过
df.groupby('Col1')[['Col2', 'Col3']].apply(list)
这是链接帖子中提到的解决方案的变体,但没有给我需要的结果。
从那时起,我还想将其转换为以下形式的数据框:
xyz pqr lmn
A 1 2 NaN
B 2 3 1
C NaN 2 NaN
最佳答案
df = df.pivot(index='Col1',columns='Col2',values='Col3')
print (df)
Col2 lmn pqr xyz
Col1
A NaN 2.0 1.0
B 1.0 3.0 2.0
C NaN 2.0 NaN
df = df.set_index(['Col1','Col2'])['Col3'].unstack()
print (df)
Col2 lmn pqr xyz
Col1
A NaN 2.0 1.0
B 1.0 3.0 2.0
C NaN 2.0 NaN
但是如果:
ValueError: Index contains duplicate entries, cannot reshape
表示重复,需要 pivot_table
或与 groupby
聚合通过 mean
(可以更改为 sum
, median
),最后由 unstack
reshape :
print (df)
Col1 Col2 Col3
0 A xyz 1 <-same A, xyz
1 A xyz 5 <-same A, xyz
2 A pqr 2
3 B xyz 2
4 B pqr 3
5 B lmn 1
6 C pqr 2
df = df.groupby(['Col1','Col2'])['Col3'].mean().unstack()
print (df)
Col2 lmn pqr xyz
Col1
A NaN 2.0 3.0 (1+5)/2 = 3
B 1.0 3.0 2.0
C NaN 2.0 NaN
编辑:
通过 Col1
检查所有重复项和 Col2
:
print (df[df.duplicated(subset=['Col1','Col2'], keep=False)])
Col1 Col2 Col3
0 A xyz 1
1 A xyz 5
编辑1:
如果重复只需要第一行:
df = df.groupby(['Col1','Col2'])['Col3'].first().unstack()
print (df)
Col2 lmn pqr xyz
Col1
A NaN 2.0 1.0
B 1.0 3.0 2.0
C NaN 2.0 NaN
或者最好先通过 drop_duplicates
删除重复项然后使用第一个或第二个解决方案:
df = df.drop_duplicates(subset=['Col1','Col2'])
df = df.pivot(index='Col1',columns='Col2',values='Col3')
print (df)
Col2 lmn pqr xyz
Col1
A NaN 2.0 1.0
B 1.0 3.0 2.0
C NaN 2.0 NaN
关于python - 如何按列分组并将其他列的值作为 pandas 中的列表返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44982348/