熊猫:groupby

时间:2017-08-25 09:30:15

标签: python pandas dataframe pandas-groupby

我有数据框

df = pd.DataFrame({'member_id': [111, 111, 111, 111, 222, 222, 333, 333], 'event_duration': [12, 242, 3, 21, 4, 76, 34, 12], 'period': [1, 2, 2, 2, 3, 3, 4, 4]})

   event_duration  member_id  period
0              12        111       1
1             242        111       2
2               3        111       2
3              21        111       2
4               4        222       3
5              76        222       3
6              34        333       4
7              12        333       4

我需要计算period到每member_id的数量和期间的中位数

我用

res = df.groupby(['member_id']).agg({'period': pd.Series.nunique, 'event_duration': np.median}).reset_index()

但它打印所有时期的中位数。但我需要,例如111将中位数设为1和2期,[12, 266],我该怎么做?

2 个答案:

答案 0 :(得分:1)

这可能是你真正需要的:

df.groupby(['member_id', 'period'], as_index=False)['event_duration'].sum().groupby(['member_id'], as_index=False).agg({'period': pd.Series.nunique, 'event_duration': np.median})

   member_id  event_duration  period
0        111             139       2
1        222              80       1
2        333              46       1

答案 1 :(得分:1)

据我了解,您需要按member_id分组,然后按句点分组,以便为​​每个member_id获取每个时段的event_duration的不同值。

如果是这种情况,我会这样做:

                  event_duration
member_id period                
111       1                   12
          2                  266
222       3                   80
333       4                   46

打印:

res2 = res.groupby(['member_id']).mean()

然后,您再次通过member_id进行分组,并获得event_duration的平均值:

           event_duration
member_id                
111                   139
222                    80
333                    46

打印:

{{1}}

我希望这是你想要达到的结果。