2016-12-02 39 views
5

Tôi có một đơn giản là Pandasdataframe trong đó mỗi ô chứa danh sách. Tôi muốn chia từng phần tử của danh sách thành cột riêng của nó. Tôi có thể làm điều đó bằng cách xuất các giá trị và sau đó tạo một dataframe mới. Điều này dường như không phải là cách tốt để làm điều này đặc biệt, nếu dataframe của tôi có một cột ngoài cột danh sách.Tách danh sách trong ô Pandas thành nhiều cột

import pandas as pd 

df = pd.DataFrame(data=[[[8,10,12]], 
         [[7,9,11]]]) 

df = pd.DataFrame(data=[x[0] for x in df.values]) 

đầu ra mong muốn:

0 1 2 
0 8 10 12 
1 7 9 11 

Follow-up dựa trên @Psidom câu trả lời:

Nếu tôi đã có một cột thứ hai:

df = pd.DataFrame(data=[[[8,10,12], 'A'], 
         [[7,9,11], 'B']]) 

Làm thế nào để không bị lỏng cột khác?

đầu ra mong muốn:

0 1 2 3 
0 8 10 12 A 
1 7 9 11 B 
+2

'df [0] .apply (pd.Series)' hoạt động cho ví dụ của bạn. – Psidom

+0

@Psidom hoàn hảo! tại sao không gửi như một câu trả lời. – user2242044

Trả lời

7

Bạn có thể lặp qua Series với apply() chức năng và chuyển đổi mỗi danh sách để một Series, điều này tự động mở rộng danh sách như là một loạt theo hướng cột:

df[0].apply(pd.Series) 

# 0 1 2 
#0 8 10 12 
#1 7 9 11 

Cập nhật: Để giữ các cột khác của khung dữ liệu, bạn có thể nối kết quả với các cột bạn muốn giữ:

pd.concat([df[0].apply(pd.Series), df[1]], axis = 1) 

# 0 1 2 1 
#0 8 10 12 A 
#1 7 9 11 B 
+0

Làm cách nào để tôi không mất thêm cột (câu hỏi gốc đã sửa đổi)? – user2242044

+0

Bạn cần phương thức 'pd.concat()'. Xem bản cập nhật! – Psidom

1

Bạn có thể làm pd.DataFrame(df[col].values.tolist()) - là nhanh hơn nhiều ~ 500X

In [820]: pd.DataFrame(df[0].values.tolist()) 
Out[820]: 
    0 1 2 
0 8 10 12 
1 7 9 11 

In [821]: pd.concat([pd.DataFrame(df[0].values.tolist()), df[1]], axis=1) 
Out[821]: 
    0 1 2 1 
0 8 10 12 A 
1 7 9 11 B 

Thời gian

Medium

In [828]: df.shape 
Out[828]: (20000, 2) 

In [829]: %timeit pd.DataFrame(df[0].values.tolist()) 
100 loops, best of 3: 15 ms per loop 

In [830]: %timeit df[0].apply(pd.Series) 
1 loop, best of 3: 4.06 s per loop 

lớn

In [832]: df.shape 
Out[832]: (200000, 2) 

In [833]: %timeit pd.DataFrame(df[0].values.tolist()) 
10 loops, best of 3: 161 ms per loop 

In [834]: %timeit df[0].apply(pd.Series) 
1 loop, best of 3: 40.9 s per loop 
Các vấn đề liên quan