Pandas 数据透视表,为每个维度值创建临时列

数据挖掘 熊猫
2022-03-04 02:41:27

我是数据透视表的新手,并且拥有以下数据集:

mydict = {'City' : ['Lexington', 'Lexington', 'Louisville', 'Hartford', 'Portland', 'Dallas'],
          'State': ['KY', 'KY', 'KY', 'CT', 'ME', 'TX'],
          'Zip': ['38293', '38293', '40207', '48488', '55849', '44930'],
          'Region': ['South', 'South', 'South', 'Northeast', 'Northeast', 'South'],
          'Sales': [1000, 2000, 3000, 1500, 2000, 2300],
          'Product Type': ['Industrial', 'Consumer', 'Consumer', 'Educational', 'Educational', 'Scientific']}
dftest = pd.DataFrame(mydict)
mypivot = pd.pivot_table(dftest, values=['Sales'], index=['State', 'City'])

这将为销售创建一个列。

                   Sales
State City             
CT    Hartford     1500
KY    Lexington    1500
      Louisville   3000
ME    Portland     2000
TX    Dallas       2300

但我想要的是例如销售下的两列,对应于我的产品类型的临时列表,例如('工业','消费者')。

像这样:

                  Sales
State City        Industrial   Consumer
CT    Hartford     0           0 
KY    Lexington    1000        2000
      Louisville   0           3000
ME    Portland     0           0
TX    Dallas       0           0

这可以使用数据透视表吗?还是我必须以某种方式手动构建这样的数据框(我认为这会导致代码过于复杂)?

编辑:

我现在看到 mypivot.columns 返回一个 MultiIndex。我听说过这些,但还不知道如何操作它们。我觉得问题的解决方案在于如何指定 MultiIndex 过滤器。

1个回答

解决方案似乎相当简单。您的枢轴中唯一缺少的是,您要放在顶部以访问枢轴的列是什么。在你的情况下,而不是使用

mypivot = pd.pivot_table(dftest, values=['Sales'], index=['State', 'City'])

产生

                  Sales
State City             
CT    Hartford     1500
KY    Lexington    1500
      Louisville   3000
ME    Portland     2000
TX    Dallas       2300

你可以写

mypivot = pd.pivot_table(dftest, values=['Sales'], index=['State', 'City'], columns=['Product Type'])

这给了你

                    Sales                                  
Product Type     Consumer Educational Industrial Scientific
State City                                                 
CT    Hartford        NaN      1500.0        NaN        NaN
KY    Lexington    2000.0         NaN     1000.0        NaN
      Louisville   3000.0         NaN        NaN        NaN
ME    Portland        NaN      2000.0        NaN        NaN
TX    Dallas          NaN         NaN        NaN     2300.0

您现在可以使用.fillna链接方法来替换数据透视表中的非零值。希望这可以帮助。

编辑:如果您只想获取一组特定的列,我似乎有一个不太优雅但可行的解决方案,例如

mypivot['Sales'][['Consumer', 'Educational']]

不幸的是,它Sales从图片中删除了较高的列,产生了类似的东西

Product Type      Consumer  Educational
State City                             
CT    Hartford         0.0       1500.0
KY    Lexington     2000.0          0.0
      Louisville    3000.0          0.0
ME    Portland         0.0       2000.0
TX    Dallas           0.0          0.0

如果我能想到什么,我会在以后补充。