【问题标题】:Python - Groupby a DataFrameGroupBy objectPython - Groupby 一个 DataFrameGroupBy 对象
【发布时间】:2018-08-30 22:05:48
【问题描述】:

我在 Python 中有一个 panda 数据框,我在其中应用了 groupby。然后我想在之前的结果上应用一个新的 groupby + sum 。更具体地说,首先我在做:

  check_df = data_df.groupby(['hotel_code', 'dp_id', 'market', 'number_of_rooms'])
[['market', 'number_of_rooms']]

然后我想做:

check_df = check_df.groupby(['market'])['number_of_rooms'].sum()

所以,我收到以下错误:

    AttributeError: Cannot access callable attribute 'groupby' of 'DataFrameGroupBy'
objects, try using the 'apply' method

我的初始数据是这样的:

hotel_code | market | number_of_rooms | ....
---------------------------------------------
001        |   a    |      200        | ... 
001        |   a    |      200        |
002        |   a    |      300        | ...

请注意,我可能有像 (a - 200) 这样的对的重复项,这就是为什么我需要第一个 groupby。 我最终想要的是这样的:

Market | Rooms
--------------
a      | 3000
b      | 250

我只是想把下面的 sql 查询翻译成 python:

select a.market, sum(a.number_of_rooms)
from (
        select market, number_of_rooms
        from opinmind_dev..cg_mm_booking_dataset_full
        group by hotel_code, market, number_of_rooms
        ) as a
group by market ;

有什么办法可以解决这个问题吗?如果您需要更多信息,请告诉我。

ps。我是 Python 和数据科学的新手

【问题讨论】:

  • 你能发布几行你的输入数据和你想要的输出吗?
  • @Abhi 我刚刚做了。谢谢
  • 嗯...我想知道,'hotel_code', 'dp_id', 'number_of_rooms' 上的 groupby 是否必要?在我看来,data_df.groupby('market').number_of_rooms.sum() 应该会给你你想要的输出,因为在你的输出中你只提到了市场和房间。
  • @Will 我认为第二个答案在这里没有帮助。您是否误读了 number_of_rooms 的行数?
  • @tobsecret 对不起,你是对的。

标签: python sql pandas dataframe


【解决方案1】:

IIUC,而不是:

check_df = data_df.groupby(['hotel_code', 'dp_id', 'market', 'number_of_rooms'])
[['market', 'number_of_rooms']]

你应该这样做:

check_df = data_df.drop_duplicates(subset=['hotel_code', 'dp_id', 'market', 'number_of_rooms'])\
                  .loc[:, ['market', 'number_of_rooms']]\
                  .groupby('market')\
                  .sum()

【讨论】:

  • 谢谢,但这不起作用。我可能有像(a - 200)这样的对重复,这就是为什么我需要第一个 groupby(刚刚更新了我的帖子)
  • @harry77 我已经编辑了处理重复的逻辑。
  • 谢谢,它似乎可以工作,但我得到 。我在 drop_duplicates 处尝试了 .reset_index(),但没有成功
  • @harry77 抱歉,我忘记了.loc 中的:, 。我已经更新了。
【解决方案2】:
df = pd.DataFrame({'Market': [1,1,1,2,2,2,3,3], 'Rooms':range(8), 'C':np.random.rand(8)})

      Market  Rooms         C
0       1      0  0.187793
1       1      1  0.325284
2       1      2  0.095147
3       2      3  0.296781
4       2      4  0.022262
5       2      5  0.201078
6       3      6  0.160082
7       3      7  0.683151

您需要将列选择从分组的 DataFrame 中移开。以下任何一项都应该有效。

df.groupby('Market').sum()[['Rooms']] 
df[['Rooms']].groupby(df['Market']).sum()
         Rooms
Market       
1           3
2          12
3          13

如果您选择使用['Rooms'] 而不是[['Rooms']],您将得到一个Series 而不是DataFrame。

生成的数据框使用市场作为索引。如果要将其转换为普通数据列,请使用:

df.reset_index()
   Market  Rooms
0       1      3
1       2     12
2       3     13

【讨论】:

    【解决方案3】:

    如果我正确理解你的问题,你可以这样做 -

    data_df.groupby('Market').agg({'Rooms': np.sum}) OR 
    
    data_df.groupby(['market'], as_index=False).agg({'Rooms': np.sum})
    
    
    data_df = pd.DataFrame({'Market' : ['A','B','C','B'],
                        'Hotel'  : ['H1','H2','H4','H5'],
                        'Rooms'  : [20,40,50,34]
                      })
    
    data_df.groupby('Market').agg({'Rooms': np.sum})
    

    【讨论】:

      猜你喜欢
      • 2014-10-06
      • 1970-01-01
      • 2022-01-25
      • 2018-03-14
      • 1970-01-01
      • 2021-03-01
      • 2019-12-01
      • 2021-07-03
      • 2018-01-02
      相关资源
      最近更新 更多