Python-通过DataFrameGroupBy对象进行分组

时间:2018-08-30 22:05:48

标签: python sql pandas dataframe

我在Python中有一个熊猫数据框,在这里我要应用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),这就是为什么我需要第一个分组依据的原因。 我最终想要的是这样的:

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和数据科学的新手

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果我正确理解了您的问题,您只需-

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})

Results