熊猫重塑

时间:2015-01-19 18:27:32

标签: python pandas

我想重塑一个Pandas数据帧,以便根据一些原始列的组合创建一个新的多索引,同时取消堆叠某些行。但在阅读stacking and pivoting上的教程之后,我甚至都不知道。

基本上,我有:

# 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 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

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

>>> 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的多索引(nb。列表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
相关问题