【问题标题】:How to fill the missing multiple columns and rows for pivot table in Python?如何在 Python 中为数据透视表填充缺少的多列和多行?
【发布时间】:2018-09-05 10:13:34
【问题描述】:

是否有任何方法或函数可以填补python中缺少的数据透视表的多列和多行?

import pandas as pd
import numpy as np
from io import StringIO

csvfile = StringIO("""Date;Cat;Type;Value
01-Jan;AA;S;1
02-Jan;AA;F;2
02-Jan;BB;T;3
04-Jan;BB;T;3
05-Jan;CC;T;2
05-Jan;DD;T;1
05-Jan;BB;S;4
05-Jan;AA;S;2
05-Jan;DD;S;4""")

df = pd.read_csv(csvfile, sep = ';')
pt = pd.pivot_table(df, values = 'Value', index=['Cat', 'Type'], columns= ['Date'], aggfunc = np.sum, fill_value = 0)
pt

上面的代码结果显示如下,某些Cat的Type列缺少值(F,S,T),缺少03-Jan列:

Cat|Type|01-Jan|02-Jan|04-Jan|05-Jan|
---+----+------+------+------+------+
AA |F   |      |     2|      |      |
   |S   |     1|      |      |     2|
BB |S   |      |      |      |     4|
   |T   |      |     3|     3|      |
CC |T   |      |      |      |     2|
DD |S   |      |      |      |     4|
   |T   |      |      |      |     1|

但预期的结果是:

Cat|Type|01-Jan|02-Jan|03-Jan|04-Jan|05-Jan|
---+----+------+------+------+------+------+
AA |F   |      |     2|      |      |      |
   |S   |     1|      |      |      |     2|
   |T   |      |      |      |      |      |
BB |F   |      |      |      |      |      |
   |S   |      |      |      |      |     4|
   |T   |      |     3|      |     3|      |
CC |F   |      |      |      |      |      |
   |S   |      |      |      |      |      |
   |T   |      |      |      |      |     2|
DD |F   |      |      |      |      |      |
   |S   |      |      |      |      |     4|
   |T   |      |      |      |      |     1|

【问题讨论】:

    标签: python pandas dataframe pivot-table


    【解决方案1】:

    只需先将df['Type'] 转换为Categorical

    df['Type'] = df['Type'].astype('category')
    

    这会强制 Pandas 使用 pivot_table 显示每个值。相信 Pandas 将字符串(例如 'sum')转换为优化函数也是一种很好的做法。这是一个演示:

    df['Type'] = df['Type'].astype('category')
    
    pt = pd.pivot_table(df, values='Value', index=['Cat', 'Type'],
                        columns='Date', aggfunc='sum', fill_value=0)
    
    print(pt)
    
    Date      01-Jan  02-Jan  04-Jan  05-Jan
    Cat Type                                
    AA  F          0       2       0       0
        S          1       0       0       2
        T          0       0       0       0
    BB  F          0       0       0       0
        S          0       0       0       4
        T          0       3       3       0
    CC  F          0       0       0       0
        S          0       0       0       0
        T          0       0       0       2
    DD  F          0       0       0       0
        S          0       0       0       4
        T          0       0       0       1
    

    【讨论】:

    • @jezrael,嗯,奇怪,对我有用。可能是 Pandas 错误/版本差异。诚然,我在 0.19.2 上,但不要期望有任何改变。
    • 是的,上次签到pandas 0.23.4
    • @jezrael,可能是新版本中的错误,有时间会检查。在我看来,OP 绝对应该首先尝试这个,它更节省内存和更清洁。
    • 我对其进行了测试,没有添加答案,因为它只为我工作。
    • 你能在最新的熊猫版本中查看它吗?
    【解决方案2】:

    pivot_table 之后需要 reindex CatType 列中的所有值组合:

    m = pd.MultiIndex.from_product([df['Cat'].unique(),df['Type'].unique()], names=pt.index.names)
    pt = pt.reindex(m)
    print (pt)
    Date      01-Jan  02-Jan  04-Jan  05-Jan
    Cat Type                                
    AA  S        1.0     0.0     0.0     2.0
        F        0.0     2.0     0.0     0.0
        T        NaN     NaN     NaN     NaN
    BB  S        0.0     0.0     0.0     4.0
        F        NaN     NaN     NaN     NaN
        T        0.0     3.0     3.0     0.0
    CC  S        NaN     NaN     NaN     NaN
        F        NaN     NaN     NaN     NaN
        T        0.0     0.0     0.0     2.0
    DD  S        0.0     0.0     0.0     4.0
        F        NaN     NaN     NaN     NaN
        T        0.0     0.0     0.0     1.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2021-02-12
      相关资源
      最近更新 更多