gpt4 book ai didi

python - 使用 Pandas 选择每个 groupby 组的列的最大 N

转载 作者:太空宇宙 更新时间:2023-11-03 14:56:34 25 4
gpt4 key购买 nike

我的 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 个。

第一个 groupby = ['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 的结果中一样吗?

最佳答案

I added an issue here

理论:

When the results of a groupby on a pd.Series returns the same pd.Series values, then the original index is returned.

归结示例

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

关于python - 使用 Pandas 选择每个 groupby 组的列的最大 N,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41949697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com