使用 groupby 按条件对 pandas 列求和
sum pandas column by condition with groupby
我有大数据框,我需要对 'view_day' 列的时间段的 'view' 列求和。
数据框如下所示:
size = 400
dtype = [('view_day', 'int32'), ('account', 'int32'), ('view', 'int32')]
values = np.ones(size, dtype=dtype)
dfo = pd.DataFrame(values)
dfo['view_day'] = np.random.randint(7605, 7605 + 180, dfo.shape[0])
dfo['account'] = np.random.randint(1548051, 1548051 + 10, dfo.shape[0])
dfo['view'] = np.random.randint(600, 1800, dfo.shape[0])
view_day account view
0 7651 1548055 1338
1 7698 1548054 1147
我需要创建新的数据框,以帐户为索引,并对过去 30 天的总视图求和。新数据框如下所示:
accounts= dfo.account.unique()
size = len(accounts)
dtype = [('view_last_30', 'int32')]
values = np.zeros(size, dtype=dtype)
index = accounts
dfc1 = pd.DataFrame(values, index=index)
view_last_30
1548058 sum of view of this account for the last 30 days
1548057 "
我设法按以下方式使用 groupby 对数据进行分组和求和:
last_day= dfo['view_day'].max()
dfo['last_30'] = dfo['view_day'] > last_day- 30
gl = dfo.groupby(['account', 'last_30'])['view']
h = gl.sum()
我得到:
account last_30
1548051 False 30439
True 6713
1548052 False 27491
True 8477
如何将带有 last_30== True 的总和复制到新创建的数据框中?
所以我会得到:
view_last_30
1548051 6713
1548052 8477
get_level_values
然后使用布尔值 select
df.loc[df.index.get_level_values('last_30').values].\
reset_index('last_30',drop=True)
Out[590]:
value
account
1548051 6713
1548052 8477
您可以使用 IndexSlice 访问器:
In [57]: s
Out[57]:
account last_30
1548051 False 30439
True 6713
1548052 False 27491
True 8477
Name: val, dtype: int64
In [58]: s.loc[pd.IndexSlice[:,True]]
Out[58]:
account
1548051 6713
1548052 8477
Name: val, dtype: int64
我有大数据框,我需要对 'view_day' 列的时间段的 'view' 列求和。 数据框如下所示:
size = 400
dtype = [('view_day', 'int32'), ('account', 'int32'), ('view', 'int32')]
values = np.ones(size, dtype=dtype)
dfo = pd.DataFrame(values)
dfo['view_day'] = np.random.randint(7605, 7605 + 180, dfo.shape[0])
dfo['account'] = np.random.randint(1548051, 1548051 + 10, dfo.shape[0])
dfo['view'] = np.random.randint(600, 1800, dfo.shape[0])
view_day account view
0 7651 1548055 1338
1 7698 1548054 1147
我需要创建新的数据框,以帐户为索引,并对过去 30 天的总视图求和。新数据框如下所示:
accounts= dfo.account.unique()
size = len(accounts)
dtype = [('view_last_30', 'int32')]
values = np.zeros(size, dtype=dtype)
index = accounts
dfc1 = pd.DataFrame(values, index=index)
view_last_30
1548058 sum of view of this account for the last 30 days
1548057 "
我设法按以下方式使用 groupby 对数据进行分组和求和:
last_day= dfo['view_day'].max()
dfo['last_30'] = dfo['view_day'] > last_day- 30
gl = dfo.groupby(['account', 'last_30'])['view']
h = gl.sum()
我得到:
account last_30
1548051 False 30439
True 6713
1548052 False 27491
True 8477
如何将带有 last_30== True 的总和复制到新创建的数据框中? 所以我会得到:
view_last_30
1548051 6713
1548052 8477
get_level_values
然后使用布尔值 select
df.loc[df.index.get_level_values('last_30').values].\
reset_index('last_30',drop=True)
Out[590]:
value
account
1548051 6713
1548052 8477
您可以使用 IndexSlice 访问器:
In [57]: s
Out[57]:
account last_30
1548051 False 30439
True 6713
1548052 False 27491
True 8477
Name: val, dtype: int64
In [58]: s.loc[pd.IndexSlice[:,True]]
Out[58]:
account
1548051 6713
1548052 8477
Name: val, dtype: int64