2015-12-19 45 views
7

Giả sử DataFrame sau:.Pandas DataFrame chồng nhiều giá trị cột vào cột đơn

key.0 key.1 key.2 topic 
1 abc def ghi  8 
2 xab xcd xef  9 

Làm thế nào tôi có thể kết hợp các giá trị của tất cả các phím * cột thành một cột 'chìa khóa' duy nhất, đó là gắn liền với chủ đề này giá trị tương ứng với khóa. * cột? Đây là kết quả tôi muốn:

topic key 
1  8 abc 
2  8 def 
3  8 ghi 
4  9 xab 
5  9 xcd 
6  9 xef 

Lưu ý rằng số lượng cột key.N là biến trên một số N. bên ngoài

Trả lời

12

Bạn có thể làm tan chảy dataframe của bạn:

>>> keys = [c for c in df if c.startswith('key.')] 
>>> pd.melt(df, id_vars='topic', value_vars=keys, value_name='key') 

    topic variable key 
0  8 key.0 abc 
1  9 key.0 xab 
2  8 key.1 def 
3  9 key.1 xcd 
4  8 key.2 ghi 
5  9 key.2 xef 

Nó cũng cho bạn là nguồn gốc của khóa.


Từ v0.20, melt là một chức năng hạng nhất của lớp pd.DataFrame:

>>> df.melt('topic', value_name='key').drop('variable', 1) 

    topic key 
0  8 abc 
1  9 xab 
2  8 def 
3  9 xcd 
4  8 ghi 
5  9 xef 
+0

đơn giản và rất nhanh. Cảm ơn bạn. – borice

2

Sau khi thử nhiều cách khác nhau, tôi thấy sau đây là nhiều hay ít trực quan, cung cấp stack 's ma thuật này được hiểu :

# keep topic as index, stack other columns 'against' it 
stacked = df.set_index('topic').stack() 
# set the name of the new series created 
df = stacked.reset_index(name='key') 
# drop the 'source' level (key.*) 
df.drop('level_1', axis=1, inplace=True) 

Các dataframe kết quả là theo yêu cầu:

topic key 
0  8 abc 
1  8 def 
2  8 ghi 
3  9 xab 
4  9 xcd 
5  9 xef 

Bạn có thể muốn in kết quả trung gian để hiểu quy trình đầy đủ. Nếu bạn không nhớ có nhiều cột hơn mức cần thiết, các bước chính là set_index('topic'), stack()reset_index(name='key').

+0

Tôi không thể tìm thấy bất kỳ tài liệu nào về đối số 'name' cho' reset_index', bạn có thể giải thích cách nó hoạt động không? – imp9

+0

là [Series.reset_index()] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.reset_index.html?highlight=reset_index) – miraculixx

1

OK, vì một trong các câu trả lời hiện tại được đánh dấu là trùng lặp với câu hỏi này, tôi sẽ trả lời ở đây.

Bởi Sử dụng wide_to_long

pd.wide_to_long(df, ['key'], 'topic', 'age').reset_index().drop('age',1) 
Out[123]: 
    topic key 
0  8 abc 
1  9 xab 
2  8 def 
3  9 xcd 
4  8 ghi 
5  9 xef 
Các vấn đề liên quan