簡體   English   中英

Pandas:重塑dataframe,在一列和一個變量中拆分列

[英]Pandas: reshaping dataframe by splitting columns in a column and a variable

我有以下 dataframe 我正在嘗試融化:

import numpy as np
import pandas as pd
dates = pd.date_range('1/1/2014', periods=4)
df = pd.DataFrame(np.eye(4, ), index=dates, columns=['A_var1', 'A_var2', 'B_var1', 'B_var2'])
print(df)

             A_var1  A_var2  B_var1  B_var2
2014-01-01     1.0     0.0     0.0     0.0
2014-01-02     0.0     1.0     0.0     0.0
2014-01-03     0.0     0.0     1.0     0.0
2014-01-04     0.0     0.0     0.0     1.0

我想獲得以下內容:

            type    var1    var2  
2014-01-01   A      1.0     0.0    
2014-01-01   B      0.0     0.0    
2014-01-02   A      0.0     1.0     
2014-01-02   B      0.0     0.0  
2014-01-03   A      0.0     0.0    
2014-01-03   B      1.0     0.0
2014-01-04   A      0.0     0.0     
2014-01-04   B      0.0     1.0

關於如何有效地做到這一點的任何想法? 我知道我可以使用 melt function 但我無法讓它在那種情況下工作。

非常感謝,

您可以在多索引列上使用stack

In [304]: df.columns = df.columns.str.split('_', expand=True)

In [305]: df.stack(0).reset_index(1)
Out[305]:
           level_1  var1  var2
2014-01-01       A   1.0   0.0
2014-01-01       B   0.0   0.0
2014-01-02       A   0.0   1.0
2014-01-02       B   0.0   0.0
2014-01-03       A   0.0   0.0
2014-01-03       B   1.0   0.0
2014-01-04       A   0.0   0.0
2014-01-04       B   0.0   1.0

一種選擇是使用pyjanitor中的 pivot_longer function ,使用.value占位符:

# pip install pyjanitor
import pandas as pd
import janitor

df.pivot_longer(names_to=("type", ".value"), 
                names_sep="_", 
                ignore_index=False, 
                sort_by_appearance = True)

          type  var1  var2
2014-01-01   A   1.0   0.0
2014-01-01   B   0.0   0.0
2014-01-02   A   0.0   1.0
2014-01-02   B   0.0   0.0
2014-01-03   A   0.0   0.0
2014-01-03   B   1.0   0.0
2014-01-04   A   0.0   0.0
2014-01-04   B   0.0   1.0

.value將與其關聯的列的一部分保留為 header,而 rest 進入type列。

暫無
暫無

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

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