2015-10-07 31 views
5

Khi xếp chồng gấu trúc DataFrame, trả lại Series. Thông thường sau khi tôi xếp chồng DataFrame, tôi chuyển nó trở lại thành DataFrame. Tuy nhiên, tên mặc định đến từ các dữ liệu xếp chồng lên nhau làm cho việc đổi tên các cột một chút bị hack. Những gì tôi đang tìm kiếm là một cách dễ dàng hơn/xây dựng trong để cung cấp cho các cột hợp lý tên sau khi xếp chồng.Đặt tên cột khi xếp chồng gấu trúc DataFrame

Ví dụ, sau DataFrame:

In [64]: df = pd.DataFrame({'id':[1,2,3], 
    ...:     'date':['2015-09-31']*3, 
    ...:     'value':[100, 95, 42], 
    ...:     'value2':[200, 57, 27]}).set_index(['id','date']) 

In [65]: df 
Out[65]: 
       value value2 
id date      
1 2015-09-31 100  200 
2 2015-09-31  95  57 
3 2015-09-31  42  27 

tôi ngăn xếp và chuyển đổi nó trở lại một DataFrame như vậy:

In [68]: df.stack().reset_index() 
Out[68]: 
    id  date level_2 0 
0 1 2015-09-31 value 100 
1 1 2015-09-31 value2 200 
2 2 2015-09-31 value 95 
3 2 2015-09-31 value2 57 
4 3 2015-09-31 value 42 
5 3 2015-09-31 value2 27 

Vì vậy, để đặt tên cho các cột một cách thích hợp tôi sẽ cần phải làm một cái gì đó như thế này:

In [72]: stacked = df.stack() 

In [73]: stacked 
Out[73]: 
id date    
1 2015-09-31 value  100 
       value2 200 
2 2015-09-31 value  95 
       value2  57 
3 2015-09-31 value  42 
       value2  27 
dtype: int64 

In [74]: stacked.index.set_names('var_name', level=len(stacked.index.names)-1, inplace=True) 

In [88]: stacked.reset_index().rename(columns={0:'value'}) 
Out[88]: 
    id  date var_name value 
0 1 2015-09-31 value 100 
1 1 2015-09-31 value2 200 
2 2 2015-09-31 value  95 
3 2 2015-09-31 value2  57 
4 3 2015-09-31 value  42 
5 3 2015-09-31 value2  27 

Lý tưởng nhất, các giải pháp sẽ giống như thế này:

df.stack(new_index_name='var_name', new_col_name='value') 

Nhưng nhìn vào docs nó không giống như stack mất bất kỳ đối số như vậy. Có cách nào dễ dàng hơn/được xây dựng trong gấu trúc để đối phó với quy trình làm việc này không?

Trả lời

5

pd.melt thường hữu ích khi chuyển đổi DataFrames từ định dạng "rộng" thành "dài". Bạn có thể sử dụng pd.melt đây nếu bạn chuyển đổi các mức iddate chỉ số để cột đầu tiên:

In [56]: pd.melt(df.reset_index(), id_vars=['id', 'date'], value_vars=['value', 'value2'], var_name='var_name', value_name='value') 
Out[56]: 
    id  date var_name value 
0 1 2015-09-31 value 100 
1 2 2015-09-31 value  95 
2 3 2015-09-31 value  42 
3 1 2015-09-31 value2 200 
4 2 2015-09-31 value2  57 
5 3 2015-09-31 value2  27 
+1

+1 nhưng một chút xây dựng sẽ là lý tưởng. Cũng có thể vốn bắt đầu các tên cột như tôi đã nhầm lẫn với rất nhiều 'giá trị' s về. – josh

7

Vì vậy, đây là một cách mà bạn có thể tìm thấy một chút sạch hơn, sử dụng thực tế là columnsSeries cũng có thể mang tên.

In [45]: df 
Out[45]: 
       value value2 
id date      
1 2015-09-31 100  200 
2 2015-09-31  95  57 
3 2015-09-31  42  27 

In [46]: df.columns.name = 'var_name' 

In [47]: s = df.stack() 

In [48]: s.name = 'value' 

In [49]: s.reset_index() 
Out[49]: 
    id  date var_name value 
0 1 2015-09-31 value 100 
1 1 2015-09-31 value2 200 
2 2 2015-09-31 value  95 
3 2 2015-09-31 value2  57 
4 3 2015-09-31 value  42 
5 3 2015-09-31 value2  27 
Các vấn đề liên quan