熊猫,多索引
Posted
技术标签:
【中文标题】熊猫,多索引【英文标题】:Pandas, mulitindexing 【发布时间】:2016-10-16 12:17:05 【问题描述】:我有需要为每列聚合的数据,然后再次为每列聚合。我需要的是每个独特客户的每个产品类别的总支出。多索引应该这样做。问题是我是 Pandas 的新手,我不懂多索引。
我的数据结构如下:
Customer Products Amount
1 001 Toys 5
2 002 Toys 6
3 002 Cars 7
4 001 Toys 2
5 001 Cars 9
我需要这样的:
Customers Products Sum of ammount
001 Toys 7
Cars 9
002 Toys 6
Cars 7
稍后我需要对其进行转换,以便获得每个产品类别、每个客户的总支出。
Customer Toys Cars
001 7 9
002 6 7
我一直在玩代码,但我被卡住了。一直在阅读,但没有找到我正在寻找的东西。
【问题讨论】:
【参考方案1】:我认为您可以将groupby
与sum
一起使用:
df1 = df.groupby(['Customer','Products'])['Amount'].sum().reset_index(name='Sum of ammount')
print (df1)
Customer Products Sum of ammount
0 001 Cars 9
1 001 Toys 7
2 002 Cars 7
3 002 Toys 6
那么你可以使用pivot
from df1
:
print (df1.pivot(index='Customer',columns='Products',values='Sum of ammount'))
Products Cars Toys
Customer
001 9 7
002 7 6
如果需要pivot_table
from df
:
print (df.pivot_table(index='Customer',columns='Products',values='Amount', aggfunc=sum))
Products Cars Toys
Customer
001 9 7
002 7 6
编辑:
为了更好的df
,你可以reset_index
和rename_axis
(pandas
0.18.0
中的新功能):
print (df.pivot_table(index='Customer',columns='Products',values='Amount', aggfunc=sum)
.reset_index()
.rename_axis(None, axis=1))
Customer Cars Toys
0 001 9 7
1 002 7 6
print (df1.pivot(index='Customer',columns='Products',values='Sum of ammount')
.reset_index()
.rename_axis(None, axis=1))
Customer Cars Toys
0 001 9 7
1 002 7 6
【讨论】:
谢谢耶兹瑞尔。我最终将在 3000 万行上执行此操作,我担心带有枢轴的 RAM。我有 32 GB 可用空间。旋转的效率如何? Phhhooo,很难的问题,但pivot
是非常困难且消耗内存的操作。不过你可以试试。
我很好奇它如何与您的大号DataFrame
配合使用。
您提供的输入在一个小样本上效果很好。我添加了一个填充(0)。我现在将尝试在完整数据集上运行脚本。会让你知道。谢谢 Jazreal。
顺便说一句,也许你忘了accept我的老solution。你也可以accept
这个解决方案。谢谢。以上是关于熊猫,多索引的主要内容,如果未能解决你的问题,请参考以下文章