我在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和数据科学的新手
答案 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)