我想重塑一个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
有什么建议吗?感谢。
答案 0 :(得分:4)
原始数据框的列为weight
或yield
。我们想要这些
列名(又名“列级值”)。
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