[英]Pandas Dataframe: get average of first rows of each subgroup within a group
我有一個 pandas dataframe ,如下所示:
df = pd.DataFrame({'Person_ID': [1,1,1,1,1,1,2,2,2,3,3,3,3],
'Item_ID': [1,1,2,4,4,4,2,3,3,1,2,2,2],
'Value': [1,4,6,5,8,7,3,2,9,8,4,1,2]})
我想按 person_id 和 item_id 對它進行分組,然后得到第一行的平均值。 例如:Person_ID 1 與 'Item_ID's 1,2 和 4 “關聯”。此 Person_ID 和這些組的第一個條目的值分別是 1,6 和 5。 平均為 4。
Person_ID Item_ID Value
0 1 1 1
1 1 1 4
2 1 2 6
3 1 4 5
4 1 4 8
5 1 4 7
6 2 2 3
7 2 3 2
8 2 3 9
9 3 1 8
10 3 2 4
11 3 2 1
12 3 2 2
期望的結果:
Person_ID Average_value_first_entries
1 4
2 2.5
3 6
我注意到這個問題很相似,但是這個問題的一個更復雜的版本: Pandas dataframe 得到每個組的第一行在這種情況下,我不想按一個“id”分組,而是按兩個“id”分組並取平均值.
我嘗試了以下方法:
df.groupby(['Person_ID', 'Item_ID']).first()['Value']
但是,這會返回每個“第一個”條目,而不是平均值。
Person_ID Item_ID
1 1 1
2 6
4 5
2 2 3
3 2
3 1 8
2 4
Name: Value, dtype: int64
任何幫助,將不勝感激。 我將特別感謝“計算高效”(時間)解決方案,因為真實數據集包含 120 萬行。
在找到每組Person_ID
和Item_ID
的first
行后,您需要再次對Person_ID
進行分組以找到平均值。 像這樣:
In [1312]: d = df.groupby(['Person_ID','Item_ID'], as_index=False).head(1)
In [1315]: d.groupby('Person_ID', as_index=False)['Value'].mean()
Out[1315]:
Person_ID Value
0 1 4.0
1 2 2.5
2 3 6.0
或@Datanovice 建議的一行:
In [1320]: df.groupby(['Person_ID','Item_ID']).first().groupby(level=0)['Value'].mean().to_frame().reset_index()
Out[1320]:
Person_ID Value
0 1 4.0
1 2 2.5
2 3 6.0
我們可以做drop_duplicates
df.drop_duplicates(['Person_ID','Item_ID']).groupby(['Person_ID']).Value.mean()
Person_ID
1 4.0
2 2.5
3 6.0
Name: Value, dtype: float64
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.