熊猫数据框:获取组中每个子组的第一行的平均值

时间:2020-05-20 22:52:32

标签: python pandas pandas-groupby

我有一个熊猫数据框,如下所示:

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的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 get first row of each group 在这种情况下,我不想按两个“ 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万行。

3 个答案:

答案 0 :(得分:2)

找出每组firstPerson_ID的{​​{1}}行之后,您需要再次对Item_ID进行分组以找到均值。像这样:

Person_ID

或@Datanovice建议的单行操作:

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

答案 1 :(得分:2)

我们可以做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

答案 2 :(得分:1)

我们可以将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