Pandas: 分组
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
我需要计算每个 member_id
的 period
的数量和周期的中位数
我用
res = df.groupby(['member_id']).agg({'period': pd.Series.nunique, 'event_duration': np.median}).reset_index()
但它打印所有周期的中位数。但是我需要,例如 111
得到 1 和 2 周期的中位数,[12, 266]
,我该怎么做?
这是否是您真正需要的:
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
据我了解,您需要按 member_id 分组,然后按时间段分组,以便为每个 member_id 获得每个时间段的 event_duration 的不同值。
如果是这样的话,我会这样做:
res = df.groupby(['member_id', 'period']).sum()
这会打印:
event_duration
member_id period
111 1 12
2 266
222 3 80
333 4 46
然后,您再次按 member_id 分组,得到 event_duration:
的平均值
res2 = res.groupby(['member_id']).mean()
这会打印:
event_duration
member_id
111 139
222 80
333 46
希望这是你想要的结果。
我有数据框
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
我需要计算每个 member_id
的 period
的数量和周期的中位数
我用
res = df.groupby(['member_id']).agg({'period': pd.Series.nunique, 'event_duration': np.median}).reset_index()
但它打印所有周期的中位数。但是我需要,例如 111
得到 1 和 2 周期的中位数,[12, 266]
,我该怎么做?
这是否是您真正需要的:
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
据我了解,您需要按 member_id 分组,然后按时间段分组,以便为每个 member_id 获得每个时间段的 event_duration 的不同值。
如果是这样的话,我会这样做:
res = df.groupby(['member_id', 'period']).sum()
这会打印:
event_duration
member_id period
111 1 12
2 266
222 3 80
333 4 46
然后,您再次按 member_id 分组,得到 event_duration:
的平均值res2 = res.groupby(['member_id']).mean()
这会打印:
event_duration
member_id
111 139
222 80
333 46
希望这是你想要的结果。