cqwcns 发表于 2020-12-11 10:21

python pandas数据透视的问题

本帖最后由 cqwcns 于 2020-12-11 11:30 编辑

数据表结果大概如下,我希望实现统计出装维个人的用户属性情况(计数,分两列呈现普通用户数和高端用户数)、拜访次数和收益(求和),希望透视后的效果如图。
不知道代码要怎么写?求指教,谢谢。
import numpy as np
import pandas as pd

df = pd.DataFrame({"区域": ["茂南", "茂南", "茂南", "茂南", "信宜", "茂南", "茂南", "高州", "高州"],
                   "网格": ["油城南", "西城", "西城", "油城南", "信城南", "油城南", "西城", "高城北", "高城北"],
                   "装维": ["张学友", "刘德华", "刘德华", "郭富城", "古天乐", "张学友", "周星驰", "张家辉", "张家辉"],
                   "用户属性": ["普通", "普通", "高端", "普通", "高端", "高端", "普通", "高端", "普通"],
                   "拜访次数": ,
                   "收益": })

print(df)
df2 = pd.pivot_table(df, values=['用户属性', '收益'], index=['装维个人'], aggfunc=np.sum)
print(df2)

rsnodame 发表于 2020-12-11 11:35

pivot_table研究不深,而且直觉认为可能实现不了。建议用分组-聚合的方式

JuncoJet 发表于 2020-12-11 12:19

做不了,除非数据重排。超出了pandas功能范畴。
http://ww2.sinaimg.cn/mw690/6941baebgw1eqeo8vewv5j20mm0fr762.jpg
典型的pandas透视表是这样的

rsnodame 发表于 2020-12-11 12:24

本帖最后由 rsnodame 于 2020-12-11 12:38 编辑

gg = df.groupby('装维')
# 普通与高端的计数
df1 = gg['用户属性'].apply(lambda x:x.value_counts()).unstack(1)
# 分组求和
df2 = gg[['拜访次数','收益']].sum() # 需要两组中括号,详见https://github.com/pandas-dev/pandas/issues/23566

# 合并
dfr = df1.join(df2,how='outer')

JuncoJet 发表于 2020-12-11 13:10

rsnodame 发表于 2020-12-11 12:24
gg = df.groupby('装维')
# 普通与高端的计数
df1 = gg['用户属性'].apply(lam ...

大佬牛逼,把计数和求和也弄上去吧

rsnodame 发表于 2020-12-11 13:18

JuncoJet 发表于 2020-12-11 13:10
大佬牛逼,把计数和求和也弄上去吧

df1是计数,df2是求和,不是都写出来了么{:301_1009:}

JuncoJet 发表于 2020-12-11 13:20

rsnodame 发表于 2020-12-11 13:18
df1是计数,df2是求和,不是都写出来了么

原来楼主是这个意思,底下是解释上面的数据类型

rsnodame 发表于 2020-12-11 13:22

JuncoJet 发表于 2020-12-11 13:20
原来楼主是这个意思,底下是解释上面的数据类型

自定义一个函数然后groupby - apply也无不可。不过感觉分开来算然后合并更方便点
页: [1]
查看完整版本: python pandas数据透视的问题