如何按多列分组以在熊猫数据框中列出
Posted
技术标签:
【中文标题】如何按多列分组以在熊猫数据框中列出【英文标题】:How to groupby multiple columns to list in pandas DataFrame 【发布时间】:2020-04-27 04:14:20 【问题描述】:我有一个 DataFrame df
:
A B C date
O 4 5 5 2019-06-2
1 3 5 2 2019-06-2
2 3 2 1 2019-06-2
3 4 4 3 2019-06-3
4 5 4 6 2019-06-3
5 2 3 7 2019-06-3
现在我可以使用以下代码按一列分组:
df.groupby('date')['A'].apply(list)
A date
O [4,3,3] 2019-06-2
1 [4,5,2] 2019-06-3
但是如果想按多列分组怎么办?我已经尝试过类似的方法,但它似乎不起作用:
df.groupby('date')[['A','B','C']].apply(list)
最终的 DataFrame 应该如下所示:
A B C date
O [4,3,3] [5,5,2] [5,2,1] 2019-06-2
1 [4,5,2] [4,4,3] [3,6,7] 2019-06-3
【问题讨论】:
【参考方案1】:使用GroupBy.agg
代替GroupBy.apply
:
df1 = df.groupby('date')[['A','B','C']].agg(list).reset_index()
print (df1)
date A B C
0 2019-06-2 [4, 3, 3] [5, 5, 2] [5, 2, 1]
1 2019-06-3 [4, 5, 2] [4, 4, 3] [3, 6, 7]
编辑:如果想要进行更多聚合,请将其传递到列表中:
df2 = df.groupby('date')[['A','B','C']].agg(['mean','min','max', list])
print (df2)
A B C \
mean min max list mean min max list mean
date
2019-06-2 3.333333 3 4 [4, 3, 3] 4.000000 2 5 [5, 5, 2] 2.666667
2019-06-3 3.666667 2 5 [4, 5, 2] 3.666667 3 4 [4, 4, 3] 5.333333
min max list
date
2019-06-2 1 5 [5, 2, 1]
2019-06-3 3 7 [3, 6, 7]
然后MultiIndex列可以展平:
df2 = df.groupby('date')[['A','B','C']].agg(['mean','min','max', list])
df2.columns = df2.columns.map(lambda x: f'x[0]_x[1]')
df2 = df2.reset_index()
print (df2)
date A_mean A_min A_max A_list B_mean B_min B_max \
0 2019-06-2 3.333333 3 4 [4, 3, 3] 4.000000 2 5
1 2019-06-3 3.666667 2 5 [4, 5, 2] 3.666667 3 4
B_list C_mean C_min C_max C_list
0 [5, 5, 2] 2.666667 1 5 [5, 2, 1]
1 [4, 4, 3] 5.333333 3 7 [3, 6, 7]
【讨论】:
现在如果想要将这些列中的每一个的平均值、最小值和最大值作为单独的列?我怎样才能得到它? 在这里需要你的帮助@jezrael ***.com/questions/59699910/… @astroluv - 对不起,我忘记发表评论了,我的问题是不明白的问题:( 我的问题是我有多个列,其名称为“x_mean”、“y_mean”。如何添加另一列将使用其他列来获取新列。 “x_new = df.x_min_max_val / (df.x_max - df.x_min) * (df.x_mean - df.x_min) + df.x_min_max_val”。同样“y_new = df.y_min_max_val / (df.y_max - df.y_min) * (df.y_mean - df.y_min) + df.y_min_max_val”。我怎样才能用一个班轮做到这一点? @astroluv 一行代码的原因是什么?你需要简化代码吗?现在我离线了,只能打电话,但是for c in ['x', 'y']:df[f'c_new'] = df[f'c_min_max_val'] / ( df[f'c_max'] - df[f'c_min'] ) * (df[f'c_mean'] - df[f'c_min']) + df[f'c_min_max_val']
工作怎么样?以上是关于如何按多列分组以在熊猫数据框中列出的主要内容,如果未能解决你的问题,请参考以下文章