python - 如何按列分组并将其他列的值作为 pandas 中的列表返回?

标签 python pandas

我在将一列的值组合在一起并保留其他列的各自值时遇到了麻烦。我想做类似的事情: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

最佳答案

使用 pivot unstack :

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 (可以更改为 summedian ),最后由 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/

相关文章:

python - pip 没有在 conda 环境中正确安装 numba/llvmlite

python - 如何在 Jupyter Notebook 上使用 Matplot Basemap 定义 map 宽度/高度?

python - 根据其他列中的条件替换 pandas 列中的某些特定值

python - pd.DataFrame 在单列中打印输出

python - django admin 不在表单中显示主键

python - 在 AppEngine (python) 上使用 IN 查询最小化子查询

python - 如何知道用 pandas 用 python 完成的图表的图形引用?

python - Pandas Dataframe - 根据索引位置计算值

python-3.x - 如何从 pd.Dataframe 中提取索引

python - Symbian 应用程序上的 Python 注释用法