2017-09-07 25 views
0

我想改造下面大熊貓據幀:如何制定排在熊貓

dd = pd.DataFrame({ "zz":[1,3], "y": ["a","b"], "x": [[1,2],[1]]}) 

     x y z 
0 [1, 2] a 1 
1 [1] b 3 

到:

  x y z 
    0 1  a 1 
    1 1  b 3 
    2 2  a 1 

正如你可以看到,第一行闡述了列X到其個別元素,同時重複其他列y,z。我可以做到這一點,而不使用for循環?

回答

2

用途:

#get lengths of lists 
l = dd['x'].str.len() 

df = dd.loc[dd.index.repeat(l)].assign(x=np.concatenate(dd['x'])).reset_index(drop=True) 
print (df) 
    x y zz 
0 1 a 1 
1 2 a 1 
2 1 b 3 

但是,如果順序很重要:

df1 = pd.DataFrame(dd['x'].values.tolist()) 
          .stack() 
          .sort_index(level=[1,0]) 
          .reset_index(name='x') 
print (df1) 
    level_0 level_1 x 
0  0  0 1.0 
1  1  0 1.0 
2  0  1 2.0 

df = df1.join(dd.drop('x',1), on='level_0').drop(['level_0','level_1'], 1) 
print (df) 
    x y zz 
0 1.0 a 1 
1 1.0 b 3 
2 2.0 a 1 
0

使用joinstack可以

In [655]: dd.drop('x', 1).join(
      dd.apply(lambda x: pd.Series(x.x), axis=1) 
       .stack().reset_index(level=1, drop=True).to_frame('x')) 
Out[655]: 
    y z x 
0 a 1 1.0 
0 a 1 2.0 
1 b 3 1.0 

詳細

In [656]: dd.apply(lambda x: pd.Series(x.x), axis=1).stack().reset_index(level=1,drop=True) 
Out[656]: 
0 1.0 
0 2.0 
1 1.0 
dtype: float64 

In [657]: dd 
Out[657]: 
     x y z 
0 [1, 2] a 1 
1  [1] b 3 
0
new_dd = pd.DataFrame(dd.apply(lambda x: pd.Series(x['x']),axis=1).stack().reset_index(level=1, drop=True)) 

new_dd.columns = ['x'] 

new_dd.merge(dd[['y','zz']], left_index=True, right_index=True)