[英]Pandas pivot table arrangement no aggregation with sympbol
我想 pivot 一個 pandas dataframe 沒有聚合,而不是垂直呈現 ZDCA758FD47F2E2BCD73BBF3F20BBFE 垂直呈現它。
data = {'Period:': ['Value1', 'Value2', 'Value3', 'Value1', 'Value2', 'Value3'],
'2011': [10, 21, 20, 10, 39, 15],
'2012': [12, 45, 19, 10, 39, 15],
'2013': [12, 45, 19, 10, 39, 16],
'symbol': ['a','a','a','b','b','b']}
df = pd.DataFrame(data)
print (df)
Period: 2011 2012 2013 symbol
0 Value1 10 12 12 a
1 Value2 21 45 45 a
2 Value3 20 19 19 a
3 Value1 10 10 10 b
4 Value2 39 39 39 b
5 Value3 15 15 16 b
但我想擁有:
Period: Value1 Value2 Value3 symbol
0 2011 10 21 20 a
1 2012 12 45 19 a
2 2013 12 45 19 a
3 2011 10 39 15 b
4 2012 10 39 15 b
5 2013 10 39 16 b
你需要melt
和pivot
:
(df.melt(['Period:', 'symbol'])
.pivot(['variable', 'symbol'], 'Period:', 'value')
.reset_index().rename_axis(index=None, columns=None)
.rename(columns={'variable':'Period:'})
)
輸出:
Period: symbol Value1 Value2 Value3
0 2011 a 10 21 20
1 2011 b 10 39 15
2 2012 a 12 45 19
3 2012 b 10 39 15
4 2013 a 12 45 19
5 2013 b 10 39 16
@mozway 的回答完成了問題所需的繁重工作。
這是一個輕微的變化,它對行和列進行重命名/重新排序,以獲得更接近問題中的結果:
x = df.melt(['Period:', 'symbol'])
x = x.pivot(['variable', 'symbol'], 'Period:', 'value')
x = x.reset_index().rename_axis(columns=None).rename(columns={'variable':'Period:'})
x = x[['Period:'] + list(df['Period:'].unique()) + ['symbol']].sort_values(
['symbol', 'Period:']).reset_index(drop=True)
print(x)
輸入:
Period: 2011 2012 2013 symbol
0 Value1 10 12 12 a
1 Value2 21 45 45 a
2 Value3 20 19 19 a
3 Value1 10 10 10 b
4 Value2 39 39 39 b
5 Value3 15 15 16 b
輸出:
Period: Value1 Value2 Value3 symbol
0 2011 10 21 20 a
1 2012 12 45 19 a
2 2013 12 45 19 a
3 2011 10 39 15 b
4 2012 10 39 15 b
5 2013 10 39 16 b
您可以使用stack
/ unstack
和set_index
/ reset_index
:
out = (df.set_index(['Period:', 'symbol']).unstack('Period:')
.stack(level=0).reset_index('symbol'))
print(out)
# Output
Period: symbol Value1 Value2 Value3
2011 a 10 21 20
2012 a 12 45 19
2013 a 12 45 19
2011 b 10 39 15
2012 b 10 39 15
2013 b 10 39 16
您可以像這樣進行轉置:
import pandas as pd
data = {'Period:': ['Value1', 'Value2', 'Value3', 'Value1', 'Value2', 'Value3'],
'2011': [10, 21, 20, 10, 39, 15],
'2012': [12, 45, 19, 10, 39, 15],
'2013': [12, 45, 19, 10, 39, 16],
'symbol': ['a','a','a','b','b','b']}
df = pd.DataFrame(data)
print (df)
dft = df.transpose()
dft
結果:
0 1 2 3 4 5
Period: Value1 Value2 Value3 Value1 Value2 Value3
2011 10 21 20 10 39 15
2012 12 45 19 10 39 15
2013 12 45 19 10 39 16
symbol a a a b b b
請注意,sympol 列也已轉置。
您可以使用:
df.melt(['Period:', 'symbol']).groupby(['symbol','variable', 'Period:'])['value'].agg(lambda x: x).unstack('Period:').reset_index().rename_axis(index=None, columns=None).rename(columns={'variable':'Period'})
Output:
symbol Period Value1 Value2 Value3
0 a 2011 10 21 20
1 a 2012 12 45 19
2 a 2013 12 45 19
3 b 2011 10 39 15
4 b 2012 10 39 15
5 b 2013 10 39 16
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.