Pandas 重塑
Pandas reshaping
我想重塑 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
有什么建议吗?谢谢
原始数据框有一列的值为 weight
或 yield
。我们希望这些成为
列名(又名 "column level values")。
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)
首先使用列表 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
我想重塑 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
有什么建议吗?谢谢
原始数据框有一列的值为 weight
或 yield
。我们希望这些成为
列名(又名 "column level values")。
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)
首先使用列表 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