Pandas重塑

4
我想将Pandas dataframe重新塑形,以基于某些原始列的组合具有新的多级索引,并同时展开一些行。但是即使阅读了关于堆叠和透视的教程,我也不知道如何做。
基本上,我有:
# fruit      year, variable, value
fruits = \ 
 [('apples' , 2014, 'weight', 1.4),
 ('apples' , 2015, 'weight', 1.5),
 ('bananas', 2014, 'yield', 0.5),
 ('bananas', 2015, 'yield', 0.6),
 ('bananas', 2014, 'weight', 1.4)]
df = DataFrame(fruits)

结果应该是:
 multi-index
/----------\
fruit   year   weight yield
apples  2014   1.4    NaN
        2015   1.5    NaN
bananas 2014   1.4    0.5
        2015   NaN    0.6

有什么建议吗?谢谢。
2个回答

4
原始数据框中有一个列包含值weightyield。我们想要将它们作为列名(也称为“列级值”)。 set_index可以将列值移动到索引级值中。 unstack可以将索引级值移动到列级值中。
将两者结合起来,我们得到:
fruits = \ 
 [('apples' , 2014, 'weight', 1.4),
 ('apples' , 2015, 'weight', 1.5),
 ('bananas', 2014, 'yield', 0.5),
 ('bananas', 2015, 'yield', 0.6),
 ('bananas', 2014, 'weight', 1.4)]
df = pd.DataFrame(fruits, columns='fruit year col val'.split())
df = df.set_index(['fruit', 'year', 'col'])
df = df.unstack(level='col')
df.columns = df.columns.droplevel(0)

产生的结果为
col           weight  yield
fruit   year               
apples  2014     1.4    NaN
        2015     1.5    NaN
bananas 2014     1.4    0.5
        2015     NaN    0.6

另一个选择是使用pivot_table
df = df.pivot_table(index=['fruit', 'year'], columns='col')
df.columns = df.columns.droplevel(0)

你的解释让我对此有了更清晰的理解,谢谢。而且它还有效。 - atp

1

首先使用列表fruits创建DataFrame,并相应地标记列:

>>> df = pd.DataFrame(fruits, columns=['fruit', 'year', 'var', 'val'])
>>> df
     fruit  year     var  val
0   apples  2014  weight  1.4
1   apples  2015  weight  1.5
2  bananas  2014   yield  0.5
3  bananas  2015   yield  0.6
4  bananas  2014  weight  1.4

使用函数pivot_table进行多级索引(注意列表index中元素的顺序很重要):

>>> df1 = pd.pivot_table(df, values='val', index=['fruit', 'year'], columns='var')
var           weight  yield
fruit   year               
apples  2014     1.4    NaN
        2015     1.5    NaN
bananas 2014     1.4    0.5
        2015     NaN    0.6

如果您不想使用'var',那么df1.columns=['weight', 'yield']可以将其删除:
>>> df1
              weight  yield
fruit   year               
apples  2014     1.4    NaN
        2015     1.5    NaN
bananas 2014     1.4    0.5
        2015     NaN    0.6

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