2017-12-13 87 views
5

Giả sử tôi có một khung dữ liệu với các cột có chuỗi, chuỗi và số nguyên mà tôi muốn kết hợp vào một khung dữ liệu mới với chuỗi và số nguyên được kết hợp với mọi mục nhập trong chuỗi. Làm thế nào tôi có thể đi về nó?Tạo một khung dữ liệu từ một chuỗi và một chuỗi

Với ví dụ này:

data = {'fruits': ['banana', 'apple', 'pear'], 
    'source' : (['brazil', 'algeria', 'nigera'], ['brazil', 'morocco', 'iran', 'france'], ['china', 'india', 'mexico']), 
    'prices' : [2, 3, 7]} 
df = pd.DataFrame(data, columns = ['fruits', 'source', 'prices']) 

Tôi muốn để có được một dataframe 3x10 với;

['banana', 'banana', 'banana', 'apple', 'apple', 'apple', 'apple', 'pear', 'pear', 'pear'], 
['brazil', 'algeria', 'nigera', 'brazil', 'morocco', 'iran', 'france', 'china', 'india', 'mexico'], 
['2', '2', '2', '3', '3', '3', '3', '7', '7', '7'], 

Tôi đoán nó không quá phức tạp nhưng tôi không thể tìm được giải pháp gọn gàng.

+0

Nếu câu trả lời hữu ích cho bạn, vui lòng [bỏ phiếu và chấp nhận] (https://stackoverflow.com/help/someone-answers). Cảm ơn! –

Trả lời

7

Sử dụng explode() chức năng:

In [30]: explode(df, lst_cols='source') 
Out[30]: 
    fruits source prices 
0 banana brazil  2 
1 banana algeria  2 
2 banana nigera  2 
3 apple brazil  3 
4 apple morocco  3 
5 apple  iran  3 
6 apple france  3 
7 pear china  7 
8 pear india  7 
9 pear mexico  7 
+0

Điều này rất hay: -) giống như 'unnest' trong R, hy vọng 'pandas' có thể xem xét thêm nó vào mô-đun của họ – Wen

+0

Thật tuyệt vời khi có thể xem lại câu trả lời cũ của bạn và sử dụng lại mã. –

+0

Cảm ơn các bạn! :-) – MaxU

4

Bằng cách sử dụng stackapply(pd.Series)

df.set_index(['fruits','prices']).source.apply(pd.Series).\ 
     stack().reset_index(level=['fruits','prices']).\ 
      rename(columns={0:'source'}) 
Out[64]: 
    fruits prices source 
0 banana  2 brazil 
1 banana  2 algeria 
2 banana  2 nigera 
0 apple  3 brazil 
1 apple  3 morocco 
2 apple  3  iran 
3 apple  3 france 
0 pear  7 china 
1 pear  7 india 
2 pear  7 mexico 

PA2 tái df của bạn

df1=df[['fruits','prices']].reindex(df.index.repeat(df.source.apply(len))) 
df1['source']=np.concatenate(df.source.values) 
df1 
Out[69]: 
    fruits prices source 
0 banana  2 brazil 
0 banana  2 algeria 
0 banana  2 nigera 
1 apple  3 brazil 
1 apple  3 morocco 
1 apple  3  iran 
1 apple  3 france 
2 pear  7 china 
2 pear  7 india 
2 pear  7 mexico 
4

bắn của tôi tại đây sử dụng concat + melt-

c = ['fruits', 'prices'] 
df = pd.concat([pd.DataFrame(df.source.tolist()), df[c]], 1)\ 
     .melt(c, value_name='source')\ 
     .drop('variable', 1)\ 
     .dropna() 

df 

    fruits prices source 
0 banana  2 brazil 
1 apple  3 brazil 
2  pear  7 china 
3 banana  2 algeria 
4 apple  3 morocco 
5  pear  7 india 
6 banana  2 nigera 
7 apple  3  iran 
8  pear  7 mexico 
10 apple  3 france 
Các vấn đề liên quan