2017-06-17 34 views
6

Trong gấu trúc thế nào để đi từ một:Reshape hàng để cột trong gấu trúc dataframe

a = pd.DataFrame({'foo': ['m', 'm', 'm', 's', 's', 's'], 
        'bar': [1, 2, 3, 4, 5, 6]}) 
>>> a 
    bar foo 
0 1 m 
1 2 m 
2 3 m 
3 4 s 
4 5 s 
5 6 s 

để b:

b = pd.DataFrame({'m': [1, 2, 3], 
        's': [4, 5, 6]}) 
>>> b 
    m s 
0 1 4 
1 2 5 
2 3 6 

tôi đã cố gắng giải pháp trong câu trả lời khác, ví dụ herehere nhưng không ai có vẻ làm những gì tôi muốn.

Về cơ bản, tôi muốn trao đổi các hàng có cột và thả chỉ mục, nhưng cách thực hiện?

Trả lời

5
a.set_index(
    [a.groupby('foo').cumcount(), 'foo'] 
).bar.unstack() 
+0

thể bạn chi tiết một chút những gì đang xảy ra? Tôi đã xem tài liệu GroupBy.cumcount(), nhưng nó hơi khó hiểu. – PedroA

+1

Tôi xin lỗi vì thiếu chi tiết. Tôi đang trên điện thoại của tôi. Vấn đề với thông tin bạn có là bạn cần phân biệt giữa các giá trị khác nhau với cùng giá trị foo. Cumcount thực hiện chính xác điều đó bằng cách tạo ra một 0, 1 và 2 cho 3 đầu tiên và cùng một lần nữa cho lần thứ ba. Hơn nữa là nó sẽ làm việc nếu họ không phải là cả hai kích thước 3. Với các vị trí tôi đặt chỉ số tại, nó được đặt ra hoàn hảo cho một unstack. – piRSquared

+0

@piRSquared Cảm ơn bạn, tìm hiểu thêm về set_index – Wen

3

Đây là giải pháp của tôi

a = pd.DataFrame({'foo': ['m', 'm', 'm', 's', 's', 's'], 
        'bar': [1, 2, 3, 4, 5, 6]}) 
a.pivot(columns='foo', values='bar').apply(lambda x: pd.Series(x.dropna().values)) 

foo m s 
0 1.0 4.0 
1 2.0 5.0 
2 3.0 6.0 
Các vấn đề liên quan