【问题标题】: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

我一直在玩代码,但我被卡住了。一直在阅读,但没有找到我正在寻找的东西。

【问题讨论】:

    标签: python pandas dataframe pivot-table multi-index


    【解决方案1】:

    我认为您可以将groupbysum 一起使用:

    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_indexrename_axispandas0.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这个解决方案。谢谢。
    猜你喜欢
    • 2019-01-19
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多