【问题标题】:Handing complex data transformations with pivot_table in Python在 Python 中使用 pivot_table 处理复杂的数据转换
【发布时间】:2020-10-08 11:38:33
【问题描述】:

我正在使用形状为7837 rows and 19 columnspandas DataFrame。我有兴趣获得product_id 每月出现的次数,即date 列和相关联的amount。因为product_id 可以有不同的数量。所以我正在寻找一种方式来表达例如product_id 1921 和amount 59 出现......

这里是pandas dataframe的小版本

print(df)

     CompanyName        Produktname     product_id    amount       Date
0     companyA            productA        1921         59.0       Jan-2020
1     companyB            productB        114          NaN        May-2020
2     companyC            productC        469          NaN        Feb-2020
3     companyD            productD        569          18.0       Jun-2020
4     companyE            productE        569          18.0      March-2020

我认为 pivot_table 可能会有所帮助。我想先看看每个product_id出现了多少次以日期为列

pd.pivot_table(df, index="product_id", values= "product_id" ,columns="Date", aggfunc="count")

但我得到一个错误:

ValueError: Grouper for 'product_id' not 1-dimensional

有没有办法解决这个问题或更有效的方法来处理这个问题?

【问题讨论】:

  • df.pivot_table(index="product_id", values= "amount" ,columns="Date", aggfunc="count") ?
  • 看来你需要把values= "product_id"改成values= "amount"

标签: python python-3.x pandas dataframe pivot-table


【解决方案1】:

IIUC 使用:

df = df.pivot_table(index="product_id", values= "amount" ,columns="Date", aggfunc="count")
print (df)
Date        Feb-2020  Jan-2020  Jun-2020  March-2020  May-2020
product_id                                                    
114              NaN       NaN       NaN         NaN       0.0
469              0.0       NaN       NaN         NaN       NaN
569              NaN       NaN       1.0         1.0       NaN
1921             NaN       1.0       NaN         NaN       NaN

为了正确的顺序可以使用:

df['Date'] = pd.to_datetime(df['Date'], format='%b-%Y')
df = df.pivot_table(index="product_id", 
                    values= "amount" ,
                    columns="Date", 
                    aggfunc="count", 
                    fill_value=0).rename(columns = lambda x: x.strftime('%b-%Y'))
print (df)
Date        Jan-2020  Feb-2020  Mar-2020  May-2020  Jun-2020
product_id                                                  
114                0         0         0         0         0
469                0         0         0         0         0
569                0         0         1         0         1
1921               1         0         0         0         0

【讨论】:

  • 感谢您的帮助!一个问题,product_id 有各种amount。我如何知道每个 product_id 的金额。它在引擎盖下做什么?它是否从product_id 中汇总了amount 的计数。更多解释,product_id114 可以有不同的数量,如 50、100、200。让它们分别出现 2、3、4 次。它是否对 product_id 中的 amount 的所有计数进行聚合
  • @Pythonista - 我有点困惑,你需要, aggfunc="sum" 而不是, aggfunc="count"
  • 是否可以将product_id 用作index 并将product_id 用作values
  • @Pythonista - 新列df = df.assign(new = df['product_id']).pivot_table(index="product_id", values= "amount" ,columns="new", aggfunc="count")的可能解决方案@
猜你喜欢
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 2021-03-31
  • 2020-05-31
  • 1970-01-01
  • 2012-12-05
相关资源
最近更新 更多