簡體   English   中英

pandas dataframe中的數據組轉置

[英]Transposing group of data in pandas dataframe

我有一個像這樣的大 dataframe:

|type| qt  | vol|
|----|---- | -- |
| A  | 1   | 10 |
| A  | 2   | 12 |
| A  | 1   | 12 |
| B  | 3   | 11 |
| B  | 4   | 20 |
| B  | 4   | 20 |
| C  | 4   | 20 |
| C  | 4   | 20 |
| C  | 4   | 20 |
| C  | 4   | 20 |

如何像這樣水平分組轉置到 dataframe ?

|A.            |B.            |C.            |
|--------------|--------------|--------------|
|type| qt | vol|type| qt | vol|type| qt | vol|
|----|----| ---|----|----| ---|----|----| ---|
| A  | 1  | 10 | B  | 3  | 11 | C  | 4  | 20 |
| A  | 2  | 12 | B  | 4  | 20 | C  | 4  | 20 |
| A  | 1  | 12 | B  | 4  | 20 | C  | 4  | 20 |
                              | C  | 4  | 20 |

您可以在type上對 dataframe 進行group ,然后在 dict 理解中創建組的鍵值對,最后沿axis=1使用concat並傳遞可選的keys參數以獲得最終結果:

d = {k:g.reset_index(drop=True) for k, g in df.groupby('type')}
pd.concat(d.values(), keys=d.keys(), axis=1)

或者,您可以使用groupby + cumcount為每個組創建一個順序計數器,然后創建一個具有兩個級別的multilevel索引,其中第一級是計數器,第二級是列type本身,最后使用stack后跟unstackreshape

c = df.groupby('type').cumcount()
df.set_index([c, df['type'].values]).stack().unstack([1, 2])

     A              B              C       
  type   qt  vol type   qt  vol type qt vol
0    A    1   10    B    3   11    C  4  20
1    A    2   12    B    4   20    C  4  20
2    A    1   12    B    4   20    C  4  20
3  NaN  NaN  NaN  NaN  NaN  NaN    C  4  20

這幾乎是 pivot 一列:

(df.assign(idx=df.groupby('type').cumcount())
   .pivot(index='idx',columns='type', values=df.columns)
   .swaplevel(0,1, axis=1)
   .sort_index(axis=1)
)

Output:

type    A              B            C         
       qt type  vol   qt type  vol qt type vol
idx                                           
0       1    A   10    3    B   11  4    C  20
1       2    A   12    4    B   20  4    C  20
2       1    A   12    4    B   20  4    C  20
3     NaN  NaN  NaN  NaN  NaN  NaN  4    C  20

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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