【问题标题】:Pandas groupby gives wrong valuesPandas groupby 给出了错误的值
【发布时间】:2019-10-17 01:51:06
【问题描述】:

我在 python 中使用 pandas 编写了一个由数字和字符串组成的数据框:

import pandas as pd
import numpy as np
d = {'col1': [1, 5,1,5,1,5,1,5], 'col2': [20,20,40,40,20,20,40,40],\
     'col3': np.arange(1,9)*0.1,\
     'col4':['Jen','Ross','Chan','Mon','Joe','Phebe','Janice','Gunter']}
df = pd.DataFrame(data=d)

数据框如下:

col1    col2    col3    col4
0   1   20      0.1     Jen
1   5   20      0.2     Ross
2   1   40      0.3     Chan
3   5   40      0.4     Mon
4   1   20      0.5     Joe
5   5   20      0.6     Phoebe
6   1   40      0.7     Janice
7   5   40      0.8     Gunther

使用 groupby,我想为每个唯一的 (x,y) 对找到 col3 的最小值,其中 x 属于 col1,y 属于 col2。我还需要知道 col4 中导致这样一个分钟的相应名称是什么。我做到了:

df2=df.groupby(['col1','col2']).min()
print(df2)

我明白了:

col1    col2    col3    col4        
1       20      0.1     Jen
        40      0.3     Chan
5       20      0.2     Phoebe
        40      0.4     Gunther

如您所见,最后两行是错误的。查看表中的 (5,20) 对,最小值为 0.2(正确),但出现在 ross(不是 Phoebe)。我怎样才能解决这个问题?

【问题讨论】:

  • DataFrameGroupBy.min() 为您提供 each 组的 each 非分组列的最小值。它不会为您提供特定列最小的行。
  • 您的代码在哪里指定您尝试获取col3 的最小值?
  • GroupBy.min独立聚合每一列。 ['Phoebe', 'Ross'] 的最小值是 'Phoebe'。如果您需要行绑定解决方案,请参阅发布的答案

标签: python python-3.x pandas dataframe


【解决方案1】:

我们可以使用idxmin 修复该问题

df.loc[df.groupby(['col1','col2'])['col3'].idxmin(),:]
   col1  col2  col3  col4
0     1    20   0.1   Jen
2     1    40   0.3  Chan
1     5    20   0.2  Ross
3     5    40   0.4   Mon

drop_duplicates

df.sort_values(['col3']).drop_duplicates(['col1','col2'])
   col1  col2  col3  col4
0     1    20   0.1   Jen
1     5    20   0.2  Ross
2     1    40   0.3  Chan
3     5    40   0.4   Mon

【讨论】:

  • 谢谢。但是,为什么会出现问题?我错过了什么? groupby 不应该正常工作吗?
  • @Albert 首先,您从未指定要在组中获得最小值的列。
【解决方案2】:

nsmallest

IMO,使用 WeNYoBen 的 drop_duplicates 答案。

这个答案的优点是它可以很容易地从每个组中获取n 的行数。

See nsmallest
See nlargest

pd.concat(d.nsmallest(n=1, columns=['col3']) for _, d in df.groupby(['col1', 'col2']))

   col1  col2  col3  col4
0     1    20   0.1   Jen
2     1    40   0.3  Chan
1     5    20   0.2  Ross
3     5    40   0.4   Mon

【讨论】:

    猜你喜欢
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2016-04-22
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多