簡體   English   中英

Pandas pivot 表排列無聚合,帶符號

[英]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

你需要meltpivot

(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 / unstackset_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM