【问题标题】:Pandas GroupedBy Dataframe sorting by values of columnPandas GroupBy Dataframe 按列值排序
【发布时间】:2021-04-20 22:28:42
【问题描述】:

我的问题是关于排序的。我在这里阅读了多个关于 groupby 数据帧排序的问题,但没有一个能解决我的问题,或者我做错了什么,因为我得到了不同的错误,例如 bool not callablesort_values not available 或类似的东西。

我得到了一个包含一些信息和列的数据框。然后我根据 2 个字段正确创建了一个 groupby 数据框。

然后我这样做:

for name, group in mydfgrouped:
    print(name, len(group))

我得到的输出是这样的:

('A', 'HH') 414
('A', 'LW') 1413
('A', 'ME') 1458
('A', 'MR') 339
('B', 'HH') 126
('B', 'LW') 288
('B', 'ME') 315
('B', 'MR') 54
('C', 'HH') 879
('C', 'LW') 672
('C', 'ME') 984
('C', 'MR') 186
('D', 'HH') 246
('D', 'LW') 756
('D', 'ME') 795
('D', 'MR') 255

我想根据 2 个标准对这个数据框进行排序:

  1. 群组HH的len 降序顺序
  2. 命名升序顺序(这是为了以防“HH”出现平局)

所以想法是显示相同的列表,但根据HH 的值降序排序,但显示该名称的所有统计信息。

我的预期输出是:

('C', 'HH') 879
('C', 'LW') 672
('C', 'ME') 984
('C', 'MR') 186
('A', 'HH') 414
('A', 'LW') 1413
('A', 'ME') 1458
('A', 'MR') 339
('D', 'HH') 246
('D', 'LW') 756
('D', 'ME') 795
('D', 'MR') 255
('B', 'HH') 126
('B', 'LW') 288
('B', 'ME') 315
('B', 'MR') 54

如您所见,名称C 排在第一位,因为它在HH (879) 组中获得了最高的len。我想从C 获取所有组。最后一个是B,因为它获得了HH组中最低的len (126)

sort_values 和 sort 对我不起作用

【问题讨论】:

  • 能否请您提供一小部分数据?我们不需要 16 行——大约 5 行就可以了。

标签: python python-3.x pandas dataframe numpy


【解决方案1】:

假设您分组的第二列称为y,您可以这样做:

# mydfgrouped = df.groupby(['x', 'y'])

s = mydfgrouped.size().unstack('y').sort_values('HH', ascending=False).stack()

for (i, l) in s.items():
    print(i, l)

输出:

('C', 'HH') 879
('C', 'LW') 672
('C', 'ME') 984
('C', 'MR') 186
('A', 'HH') 414
('A', 'LW') 1413
('A', 'ME') 1458
('A', 'MR') 339
('D', 'HH') 246
('D', 'LW') 756
('D', 'ME') 795
('D', 'MR') 255
('B', 'HH') 126
('B', 'LW') 288
('B', 'ME') 315
('B', 'MR') 54

简要说明:

# unstack `y` into columns
mydfgrouped.size().unstack('y')

# y   HH    LW    ME   MR
# x                      
# A  414  1413  1458  339
# B  126   288   315   54
# C  879   672   984  186
# D  246   756   795  255

# sort by HH
mydfgrouped.size().unstack('y').sort_values('HH', ascending=False)

# y   HH    LW    ME   MR
# x                      
# C  879   672   984  186
# A  414  1413  1458  339
# D  246   756   795  255
# B  126   288   315   54

# stack `y` back into rows
mydfgrouped.size().unstack('y').sort_values('HH', ascending=False).stack()

【讨论】:

  • 谢谢,这就是我想要的。现在我需要了解这个尺寸、堆栈和新东西。非常感谢!
  • 是的,完全正确!我已经添加了一个关于那里发生了什么的简短解释,希望它有助于让它变得不那么神秘)
猜你喜欢
  • 2017-01-09
  • 2017-10-16
  • 2018-02-14
  • 2017-04-15
  • 2016-09-14
  • 1970-01-01
  • 2017-08-30
  • 2018-08-29
  • 2017-01-06
相关资源
最近更新 更多