【问题标题】:Pandas better way for Sorting, Grouping, SummingPandas 更好的排序、分组、求和方法
【发布时间】:2016-12-15 07:16:52
【问题描述】:

Pandas 的新手,所以想知道是否有更 Pandithic(创造它!)的方法来对一些数据进行排序、分组,然后对其中的一部分求和。问题是在一系列值中找到最大的 3 个值,然后将它们相加。

census_cp 是一个包含州县信息的数据框。我目前的解决方案是:

cen_sort = census_cp.groupby('STNAME').head(3)
cen_sort = cen_sort.groupby('STNAME').sum().sort_values(by='CENSUS2010POP', ascending=False).head(n=3)
cen_sort = cen_sort.reset_index()
print(cen_sort['STNAME'].values.tolist())

我特别好奇是否有更好的方法来做到这一点,以及为什么我不能将总和放在前一行的末尾,并将我认为明显相关的项目链接在一起(获取每个项目的前 3 个)并将它们加在一起)。

【问题讨论】:

  • 值是否首先排序并按.head(3) 需要每个组的顶部3 值?
  • 技术术语当然是“熊猫人”。

标签: python pandas


【解决方案1】:

我认为您可以先将headsumgroupby 一起使用,然后再与nlargest 一起使用:

df = census_cp.groupby('STNAME')
              .apply(lambda x: x.head(3).sum(numeric_only=True))
              .reset_index()
              .nlargest(3, 'CENSUS2010POP')

示例:

census_cp = pd.DataFrame({'STNAME':list('abscscbcdbcsscae'),
                   'CENSUS2010POP':[4,5,6,5,6,2,3,4,5,6,4,5,4,3,6,5]})

print (census_cp)
    CENSUS2010POP STNAME
0               4      a
1               5      b
2               6      s
3               5      c
4               6      s
5               2      c
6               3      b
7               4      c
8               5      d
9               6      b
10              4      c
11              5      s
12              4      s
13              3      c
14              6      a
15              5      e


df = census_cp.groupby('STNAME') \
              .apply(lambda x: x.head(3).sum(numeric_only=True)) \
              .reset_index() \
              .nlargest(3, 'CENSUS2010POP')
print (df)
  STNAME  CENSUS2010POP
5      s             17
1      b             14
2      c             11

如果需要每组双顶 3 nlargest 然后使用求和值的 nlargest

df1 = census_cp.groupby('STNAME')['CENSUS2010POP']
               .apply(lambda x: x.nlargest(3).sum())
               .nlargest(3)
               .reset_index()
print (df1)
  STNAME  CENSUS2010POP
0      s             17
1      b             14
2      c             13

或者:

df1 = census_cp.groupby('STNAME')['CENSUS2010POP'].nlargest(3)
               .groupby(level=0)
               .sum()
               .nlargest(3)
               .reset_index() 
print (df1)
  STNAME  CENSUS2010POP
0      s             17
1      b             14
2      c             13

【讨论】:

  • 爱最大的。好奇将不同的操作放在不同的行上。这是 pandas 中的首选语法,还是您只是为了易读而这样做?每个命令末尾还需要'\'吗?
  • 不,\ 仅适用于 python 代码中的长行。如果省略 python 有时会返回错误。但是可能只使用一行代码,但它的可读性较差。
猜你喜欢
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
相关资源
最近更新 更多