簡體   English   中英

Pandas Dataframe:獲取組內每個子組的第一行的平均值

[英]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_IDItem_IDfirst行后,您需要再次對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

我們可以將groupbyunstack結合起來

(df.groupby(['Person_ID','Item_ID'])
 .first()
 .unstack()
 .mean(1)
 .reset_index(name='Average_value_first_entries')
  )

    Person_ID   Average_value_first_entries
0       1               4.0
1       2               2.5
2       3               6.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM