【问题标题】:select largest N of a column of each groupby group using pandas使用 pandas 选择每个 groupby 组的一列中最大的 N
【发布时间】:2017-01-31 04:35:12
【问题描述】:

我的 df:

{'city1': {0: 'Chicago',
  1: 'Chicago',
  2: 'Chicago',
  3: 'Chicago',
  4: 'Miami',
  5: 'Houston',
  6: 'Austin'},
 'city2': {0: 'Toronto',
  1: 'Detroit',
  2: 'St.Louis',
  3: 'Miami',
  4: 'Dallas',
  5: 'Dallas',
  6: 'Dallas'},
 'p234_r_c': {0: 5.0, 1: 4.0, 2: 2.0, 3: 0.5, 4: 1.0, 5: 4.0, 6: 3.0},
 'plant1_type': {0: 'COMBCYCL',
  1: 'COMBCYCL',
  2: 'NUKE',
  3: 'COAL',
  4: 'NUKE',
  5: 'COMBCYCL',
  6: 'COAL'},
 'plant2_type': {0: 'COAL',
  1: 'COAL',
  2: 'COMBCYCL',
  3: 'COMBCYCL',
  4: 'COAL',
  5: 'NUKE',
  6: 'NUKE'}}

我想做 2 个 groupby 操作,并使用列 p234_r_c 取每个组中最大的 1 个。

第一个分组 = ['plant1_type', 'plant2_type', 'city1']

第二组=['plant1_type', 'plant2_type', 'city2']

因此,我执行以下操作:

df.groupby(['plant1_type','plant2_type','city1'])['p234_r_c'].\
    nlargest(1).reset_index()


plant1_type plant2_type city1   level_3 p234_r_c
0   COAL    COMBCYCL    Chicago 3   0.5
1   COAL    NUKE        Austin  6   3.0
2   COMBCYCL    COAL    Chicago 0   5.0
3   COMBCYCL    NUKE    Houston 5   4.0
4   NUKE    COAL        Miami   4   1.0
5   NUKE    COMBCYCL    Chicago 2   2.0

第一个 groupby 的结果是有意义的。但是,我对第二个 groupby 的结果感到困惑:

df.groupby(['plant1_type','plant2_type','city2'])['p234_r_c'].\
    nlargest(1).reset_index()

index   p234_r_c
0   0   5.0
1   1   4.0
2   2   2.0
3   3   0.5
4   4   1.0
5   5   4.0
6   6   3.0

结果中的列plant1_typeplant2_typecity2 发生了什么变化?他们不应该像plant1_typeplant2_typecity1出现在第一个groupby的结果中一样出现在结果中吗?

【问题讨论】:

  • 你可能发现了一个bug
  • 好发现! @codingknob

标签: python pandas group-by


【解决方案1】:

I added an issue here

理论:

pd.Series 上的groupby 的结果返回相同的pd.Series 值时,则返回原始索引。

简化示例

df = pd.DataFrame(dict(A=[0, 1, 2, 3]))

# returns results identical to df.A
print(df.groupby(df.A // 2).A.nsmallest(2))

# returns results out of order
print(df.groupby(df.A // 2).A.nlargest(2))

0    0
1    1
2    2
3    3
Name: A, dtype: int64
A   
0  1    1
   0    0
1  3    3
   2    2
Name: A, dtype: int64

我认为您希望这些返回相同的一致索引。

这是最严重的后果:

# most egregious
# this will be randomly different
print(df.groupby(df.A // 2).A.apply(pd.Series.sample, n=2))

在一次执行时返回它

A   
0  1    1
   0    0
1  2    2
   3    3
Name: A, dtype: int64

这个在另一个

0    0
1    1
2    2
3    3
Name: A, dtype: int64

当然这永远不会有问题,因为不可能返回与原始值相同的值

print(df.groupby(df.A // 2).A.apply(pd.Series.sample, n=1))

A   
0  0    0
1  2    2
Name: A, dtype: int64

解决方法
set_index

cols = ['plant1_type','plant2_type','city2']
df.set_index(cols).groupby(level=cols)['p234_r_c'].\
    nlargest(1).reset_index()

  plant1_type plant2_type     city2  p234_r_c
0    COMBCYCL        COAL   Toronto       5.0
1    COMBCYCL        COAL   Detroit       4.0
2        NUKE    COMBCYCL  St.Louis       2.0
3        COAL    COMBCYCL     Miami       0.5
4        NUKE        COAL    Dallas       1.0
5    COMBCYCL        NUKE    Dallas       4.0
6        COAL        NUKE    Dallas       3.0

【讨论】:

  • 很好的研究,换句话说,如果没有聚合则错误 - df.groupby(['plant1_type','plant2_type','city1'])['p234_r_c'].\ nlargest(2).reset_index(),但如果 1 有效 - df.groupby(['plant1_type','plant2_type','city1'])['p234_r_c'].\ nlargest(1).reset_index() - 存在聚合。
  • 伙计们,有什么办法可以解决这个错误吗?
  • 如何返回索引以便可以使用它来分割原始数据帧?我想知道为 `['plant1_type','plant2_type','city2']` groupby 选择了哪个 city1 和为 ['plant1_type','plant2_type','city1'] groupby 选择了 city2
  • @piRSquared - 解决方法并非在所有情况下都有效。请看这里stackoverflow.com/questions/41986261/…
  • stackoverflow.com/questions/42030468/… 中提出的解决方法
猜你喜欢
  • 2022-12-11
  • 2018-01-11
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2021-10-11
相关资源
最近更新 更多