在pandas透视表中重新排列列

5

我有一个使用pivot_table方法创建的pandas数据框。它的结构如下:

import numpy as np
import pandas 

datadict = {
 ('Imps', '10day avg'): {'All': '17,617,872', 'Crossnet': np.nan, 'N/A': '17,617,872'},
 ('Imps', '30day avg'): {'All': '17,302,111', 'Crossnet': '110','N/A': '18,212,742'},
 ('Imps', '3day avg'): {'All': '8,029,438', 'Crossnet': '116', 'N/A': '8,430,904'},
 ('Imps', 'All'): {'All': '14,156,666', 'Crossnet': '113', 'N/A': '14,644,823'},
 ('Spend', '10day avg'): {'All': '$439', 'Crossnet': np.nan, 'N/A': '$439'},
 ('Spend', '30day avg'): {'All': '$468', 'Crossnet': '$0', 'N/A': '$492'},
 ('Spend', '3day avg'): {'All': '$209', 'Crossnet': '$0', 'N/A': '$219'},
 ('Spend', 'All'): {'All': '$368', 'Crossnet': '$0', 'N/A': '$381'}
}
df = pandas.DataFrame.from_dict(datadict)
df.columns = pandas.MultiIndex.from_tuples(df.columns)

我尝试使用以下两种方法重新排列"Spend"和"Imps"下的嵌套列,但是尽管没有出现错误,顺序仍然没有改变:

df['Spend']=df['Spend'].reindex_axis(['3day avg','10day avg','30day avg','All'],axis=1)
df['Spend']=df['Spend'][['3day avg','10day avg','30day avg','All']]
1个回答

5

一种方法是创建MultiIndex并按照它重新索引:

In [11]: mi = pd.MultiIndex.from_product([['Imps', 'Spend'], ['3day avg','10day avg','30day avg','All']])

In [12]: df.reindex_axis(mi, 1)
Out[12]: 
               Imps                                        Spend                          
           3day avg   10day avg   30day avg         All 3day avg 10day avg 30day avg   All
All       8,029,438  17,617,872  17,302,111  14,156,666     $209      $439      $468  $368
Crossnet        116         NaN         110         113       $0       NaN        $0    $0
N/A       8,430,904  17,617,872  18,212,742  14,644,823     $219      $439      $492  $381

注意:MultiIndex.from_product是0.13版本中新增的功能,如果您使用的是早于此版本的pandas,请使用pd.MultiIndex.from_tuples(list(itertools.product(..)))


我正在使用pandas 0.11,所以我想我只能使用第二种解决方案。为什么即使在新版本中也没有内置的方法来做到这一点呢? - ChrisArmstrong
@ChrisArmstrong 可能有更简洁的方式,肯定有可能。在 Github 上发布增强请求可能很值得。 - Andy Hayden
我按照您的解决方案尝试了以下代码:mi=pd.MultiIndex.from_tuples(list(itertools.product([['Imps', 'Spend'], ['3day avg','10day avg','30day avg','All']]))). 但是,在执行下一步df.reindex_axis(mi, 1)时出现了错误。请问这样做正确吗? - ChrisArmstrong
@ChrisArmstrong 哦,不应该有双括号 :) 所以...product(['Imps', 'Spend'], ['3天平均值','10天平均值','30天平均值','全部']) - Andy Hayden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接