2014-07-08 22 views
7

Tôi có một dataframe trông giống như sau:cách unstack (hoặc trục?) Trong gấu trúc

import pandas as pd 
datelisttemp = pd.date_range('1/1/2014', periods=3, freq='D') 
s = list(datelisttemp)*3 
s.sort() 
df = pd.DataFrame({'BORDER':['GERMANY','FRANCE','ITALY','GERMANY','FRANCE','ITALY','GERMANY','FRANCE','ITALY' ], 'HOUR1':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6],'HOUR2':[3 ,3 ,3, 5 ,5 ,5, 7, 7, 7], 'HOUR3':[8 ,8 ,8, 12 ,12 ,12, 99, 99, 99]}, index=s) 

này mang lại cho tôi:

Out[458]: df 

      BORDER HOUR1 HOUR2 HOUR3 
2014-01-01 GERMANY  2  3  8 
2014-01-01 FRANCE  2  3  8 
2014-01-01 ITALY  2  3  8 
2014-01-02 GERMANY  4  5  12 
2014-01-02 FRANCE  4  5  12 
2014-01-02 ITALY  4  5  12 
2014-01-03 GERMANY  6  7  99 
2014-01-03 FRANCE  6  7  99 
2014-01-03 ITALY  6  7  99 

Tôi muốn dataframe cuối cùng để trông giống như :

   HOUR GERMANY FRANCE ITALY 
2014-01-01 1  2  2  2  
2014-01-01 2  3  3  3 
2014-01-01 3  8  8  8 
2014-01-02 1  4  4  4 
2014-01-02 2  5  5  5 
2014-01-02 3 12  12  12 
2014-01-03 1  6  6  6 
2014-01-03 2  7  7  7 
2014-01-03 3 99  99  99 

tôi đã thực hiện những điều sau đây nhưng tôi không hoàn toàn có:

01.235.
df['date_col'] = df.index 

df2 = melt(df, id_vars=['date_col','BORDER']) 
#Can I keep the same index after melt or do I have to set an index like below? 
df2.set_index(['date_col', 'variable'], inplace=True, drop=True) 
df2 = df2.sort() 

df

Out[465]: df2 

         BORDER value 
date_col variable     
2014-01-01 HOUR1   GERMANY 2 
      HOUR1   FRANCE 2 
      HOUR1   ITALY  2 
      HOUR2   GERMANY 3 
      HOUR2   FRANCE 3 
      HOUR2   ITALY  3 
      HOUR3   GERMANY 8 
      HOUR3   FRANCE 8 
      HOUR3   ITALY  8 
2014-01-02 HOUR1   GERMANY 4 
      HOUR1   FRANCE 4 
      HOUR1   ITALY  4 
      HOUR2   GERMANY 5 
      HOUR2   FRANCE 5 
      HOUR2   ITALY  5 
      HOUR3   GERMANY 12 
      HOUR3   FRANCE 12 
      HOUR3   ITALY 12 
2014-01-03 HOUR1   GERMANY 6 
      HOUR1   FRANCE 6 
      HOUR1   ITALY  6 
      HOUR2   GERMANY 7 
      HOUR2   FRANCE 7 
      HOUR2   ITALY  7 
      HOUR3   GERMANY 99 
      HOUR3   FRANCE 99 
      HOUR3   ITALY 99 

Tôi nghĩ tôi có thể unstack df2 để có được một cái gì đó tương tự như dataframe cuối cùng của tôi nhưng tôi nhận được tất cả các loại lỗi. Tôi cũng đã cố gắng xoay vòng khung dữ liệu này nhưng không thể có được những gì tôi muốn.

Trả lời

13

Chúng tôi muốn các giá trị (ví dụ: 'GERMANY') để trở thành tên cột và tên cột (ví dụ: 'HOUR1') để trở thành giá trị - trao đổi các loại.

Phương thức stack chuyển tên cột thành giá trị chỉ mục và phương pháp unstack chuyển giá trị chỉ mục thành tên cột.

Vì vậy, bằng cách chuyển giá trị vào chỉ mục, chúng tôi có thể sử dụng stackunstack để thực hiện hoán đổi.

import pandas as pd 

datelisttemp = pd.date_range('1/1/2014', periods=3, freq='D') 
s = list(datelisttemp)*3 
s.sort() 
df = pd.DataFrame({'BORDER':['GERMANY','FRANCE','ITALY','GERMANY','FRANCE','ITALY','GERMANY','FRANCE','ITALY' ], 'HOUR1':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6],'HOUR2':[3 ,3 ,3, 5 ,5 ,5, 7, 7, 7], 'HOUR3':[8 ,8 ,8, 12 ,12 ,12, 99, 99, 99]}, index=s) 

df = df.set_index(['BORDER'], append=True) 
df.columns.name = 'HOUR' 
df = df.unstack('BORDER') 
df = df.stack('HOUR') 
df = df.reset_index('HOUR') 
df['HOUR'] = df['HOUR'].str.replace('HOUR', '').astype('int') 
print(df) 

mang

BORDER  HOUR FRANCE GERMANY ITALY 
2014-01-01  1  2  2  2 
2014-01-01  2  3  3  3 
2014-01-01  3  8  8  8 
2014-01-02  1  4  4  4 
2014-01-02  2  5  5  5 
2014-01-02  3  12  12  12 
2014-01-03  1  6  6  6 
2014-01-03  2  7  7  7 
2014-01-03  3  99  99  99 
+0

cảm ơn bạn đã giải thích chi tiết. Nó đã giúp tôi hiểu rõ hơn về stack/unstack. Cảm ơn bạn. – codingknob

1

Sử dụng của bạn df2:

>>> df2.pivot_table(values='value', index=['DATE', 'variable'], columns="BORDER") 
BORDER    FRANCE GERMANY ITALY 
DATE  variable       
2014-01-01 HOUR1   2  2  2 
      HOUR2   3  3  3 
      HOUR3   8  8  8 
2014-01-02 HOUR1   4  4  4 
      HOUR2   5  5  5 
      HOUR3   12  12  12 
2014-01-03 HOUR1   6  6  6 
      HOUR2   7  7  7 
      HOUR3   99  99  99 

[9 rows x 3 columns] 

Hiện vẫn còn một chút dọn dẹp để làm gì nếu bạn muốn chuyển đổi mức chỉ số "biến" thành một cột gọi là "GIỜ" và loại bỏ dòng chữ "GIỜ" từ các giá trị, nhưng tôi nghĩ đó là định dạng cơ bản bạn muốn.

Các vấn đề liên quan