2017-02-02 15 views
7

कहो मैं निम्नलिखित पांडा Dataframe है में सूचियों वाले कॉलम:"unstack" एक पांडा एकाधिक पंक्तियों

df = pd.DataFrame({"a" : [1,2,3], "b" : [[1,2],[2,3,4],[5]]}) 
    a   b 
0 1  [1, 2] 
1 2 [2, 3, 4] 
2 3  [5] 

मैं कैसे "unstack" होगा "ख" कॉलम में सूचियों ताकि इसे में बदलना करने के लिए dataframe:

a b 
0 1 1 
1 1 2 
2 2 2 
3 2 3 
4 2 4 
5 3 5 

उत्तर

6

अद्यतन: सामान्य vectorized दृष्टिकोण - एकाधिक स्तंभों डीएफएस के लिए भी काम करेगा:

संभालने हम के लिए है llowing DF:

In [159]: df 
Out[159]: 
    a   b c 
0 1  [1, 2] 5 
1 2 [2, 3, 4] 6 
2 3  [5] 7 

समाधान:

In [160]: lst_col = 'b' 

In [161]: pd.DataFrame({ 
    ...:  col:np.repeat(df[col].values, df[lst_col].str.len()) 
    ...:  for col in df.columns.difference([lst_col]) 
    ...: }).assign(**{lst_col:np.concatenate(df[lst_col].values)})[df.columns.tolist()] 
    ...: 
Out[161]: 
    a b c 
0 1 1 5 
1 1 2 5 
2 2 2 6 
3 2 3 6 
4 2 4 6 
5 3 5 7 

सेटअप:

df = pd.DataFrame({ 
    "a" : [1,2,3], 
    "b" : [[1,2],[2,3,4],[5]], 
    "c" : [5,6,7] 
}) 

vectorized NumPy दृष्टिकोण:

In [124]: pd.DataFrame({'a':np.repeat(df.a.values, df.b.str.len()), 
         'b':np.concatenate(df.b.values)}) 
Out[124]: 
    a b 
0 1 1 
1 1 2 
2 2 2 
3 2 3 
4 2 4 
5 3 5 
,210

पुराने जवाब:

इस प्रयास करें:

In [89]: df.set_index('a', append=True).b.apply(pd.Series).stack().reset_index(level=[0, 2], drop=True).reset_index() 
Out[89]: 
    a 0 
0 1 1.0 
1 1 2.0 
2 2 2.0 
3 2 3.0 
4 2 4.0 
5 3 5.0 

या थोड़ा अच्छे समाधान provided by @Boud:

In [110]: df.set_index('a').b.apply(pd.Series).stack().reset_index(level=-1, drop=True).astype(int).reset_index() 
Out[110]: 
    a 0 
0 1 1 
1 1 2 
2 2 2 
3 2 3 
4 2 4 
5 3 5 
+0

हम्म, तो संलग्न हटाने और ड्रॉप स्तर -1? – Boud

+0

@ ध्वनि, अच्छा बिंदु, धन्यवाद! मैंने इसे – MaxU

+0

उत्तर में जोड़ा है, धन्यवाद! – Alex

संबंधित मुद्दे