【问题标题】:pandas - how to extract top three rows from the dataframe providedpandas - 如何从提供的数据框中提取前三行
【发布时间】:2021-03-30 04:13:08
【问题描述】:

我的 pandas 数据框 df 可能会产生如下结果:

grouped = df[(df['X'] == 'venture') & (df['company_code'].isin(['TDS','XYZ','UVW']))].groupby(['company_code','sector'])['X_sector'].count()

这个的输出如下:

company_code  sector                            
TDS           Meta                                 404
              Electrical                           333
              Mechanical                           533
              Agri                                 453
XYZ           Sports                               331
              Electrical                           354
              Movies                               375
              Manufacturing                        355            
UVW           Sports                               505
              Robotics                             345
              Movies                               56
              Health                               3263
              Manufacturing                        456
              Others                               524
Name: X_sector, dtype: int64

我想得到的是公司代码中的前三个部门。 有什么办法呢?

【问题讨论】:

  • @RahulAgarwal - 分享了用于获取输出的内容。鉴于它是一个系列,我尝试: grouped.sort_values(axis=0, ascending=False) 这会改变 group 的输出
  • 试试这个:grouped = df[(df['X'] == 'venture') & (df['company_code'].isin(['USA','IND','GBR ']))].groupby(['company_code','main_sector'])['X_sector'].count().reset_index(name='count').sort_values(['count'],ascending=False)
  • 这行得通。但它给出了计数的排序顺序。这是一部分。第二部分是从这些组排列中选择前两个。

标签: python pandas pandas-groupby


【解决方案1】:

您必须在此处链接一个 groupby。考虑这个例子:

import pandas as pd
import numpy as np

np.random.seed(111)

names = [
    'Robert Baratheon',
    'Jon Snow',
    'Daenerys Targaryen',
    'Theon Greyjoy',
    'Tyrion Lannister'
]

df = pd.DataFrame({
    'season': np.random.randint(1, 7, size=100),
    'actor': np.random.choice(names, size=100),
    'appearance': 1
})

s = df.groupby(['season','actor'])['appearance'].count()
print(s.sort_values(ascending=False).groupby('season').head(1)) # <-- head(3) for 3 values

返回:

season  actor             
4       Daenerys Targaryen    7
6       Robert Baratheon      6
3       Robert Baratheon      6
5       Jon Snow              5
2       Theon Greyjoy         5
1       Jon Snow              4

s 在哪里(剪裁为 4)

season  actor             
1       Daenerys Targaryen    2
        Jon Snow              4
        Robert Baratheon      2
        Theon Greyjoy         3
        Tyrion Lannister      4
2       Daenerys Targaryen    4
        Jon Snow              3
        Robert Baratheon      1
        Theon Greyjoy         5
        Tyrion Lannister      3
3       Daenerys Targaryen    2
        Jon Snow              1
        Robert Baratheon      6
        Theon Greyjoy         3
        Tyrion Lannister      3
4 ...

【讨论】:

  • @Learner 很高兴我能帮上忙。编码愉快!
  • @AntonvBR,很好的例子! +1
【解决方案2】:

既然有可能的简单代码,为什么还要让事情变得复杂:

Z = df.groupby('country_code')['sector'].value_counts().groupby(level=0).head(3).sort_values(ascending=False).to_frame('counts').reset_index()

Z

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多