从列值的总和构建 df
build df from sum of column value
我需要按customer_id对数据进行分组,得到每个月的购买总额。我的数据如下所示:
cust_id months
1 1
1 1
1 2
1 4
2 1
2 1
所以我需要查看每个月每个客户的购买总额。期望的输出是:
cust_id mo1 mo2 mo3 mo4
1 2 1 0 1
1 2 0 0 0
使用 crosstab
with DataFrame.reindex
添加缺失的类别:
r = range(df['months'].min(), df['months'].max() + 1)
df = (pd.crosstab(df['cust_id'],df['months'])
.reindex(r, axis=1, fill_value=0)
.add_prefix('mo'))
print (df)
months mo1 mo2 mo3 mo4
cust_id
1 2 1 0 1
2 2 0 0 0
如果可能需要所有月份,请使用有序分类:
df['months'] = pd.Categorical(df['months'], ordered=True, categories=range(1, 13))
df = df.groupby(['cust_id','months']).size().unstack(fill_value=0).add_prefix('mo')
print (df)
months mo1 mo2 mo3 mo4 mo5 mo6 mo7 mo8 mo9 mo10 mo11 mo12
cust_id
1 2 1 0 1 0 0 0 0 0 0 0 0
2 2 0 0 0 0 0 0 0 0 0 0 0
或 reindex
range
所有月份:
r = range(1, 13)
df = (pd.crosstab(df['cust_id'],df['months'])
.reindex(r, axis=1, fill_value=0)
.add_prefix('mo'))
print (df)
months mo1 mo2 mo3 mo4 mo5 mo6 mo7 mo8 mo9 mo10 mo11 mo12
cust_id
1 2 1 0 1 0 0 0 0 0 0 0 0
2 2 0 0 0 0 0 0 0 0 0 0 0
我需要按customer_id对数据进行分组,得到每个月的购买总额。我的数据如下所示:
cust_id months
1 1
1 1
1 2
1 4
2 1
2 1
所以我需要查看每个月每个客户的购买总额。期望的输出是:
cust_id mo1 mo2 mo3 mo4
1 2 1 0 1
1 2 0 0 0
使用 crosstab
with DataFrame.reindex
添加缺失的类别:
r = range(df['months'].min(), df['months'].max() + 1)
df = (pd.crosstab(df['cust_id'],df['months'])
.reindex(r, axis=1, fill_value=0)
.add_prefix('mo'))
print (df)
months mo1 mo2 mo3 mo4
cust_id
1 2 1 0 1
2 2 0 0 0
如果可能需要所有月份,请使用有序分类:
df['months'] = pd.Categorical(df['months'], ordered=True, categories=range(1, 13))
df = df.groupby(['cust_id','months']).size().unstack(fill_value=0).add_prefix('mo')
print (df)
months mo1 mo2 mo3 mo4 mo5 mo6 mo7 mo8 mo9 mo10 mo11 mo12
cust_id
1 2 1 0 1 0 0 0 0 0 0 0 0
2 2 0 0 0 0 0 0 0 0 0 0 0
或 reindex
range
所有月份:
r = range(1, 13)
df = (pd.crosstab(df['cust_id'],df['months'])
.reindex(r, axis=1, fill_value=0)
.add_prefix('mo'))
print (df)
months mo1 mo2 mo3 mo4 mo5 mo6 mo7 mo8 mo9 mo10 mo11 mo12
cust_id
1 2 1 0 1 0 0 0 0 0 0 0 0
2 2 0 0 0 0 0 0 0 0 0 0 0