如何在熊猫中精心制作行

时间:2017-09-07 13:04:01

标签: python pandas functional-programming

我想转换下面的pandas数据帧:

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循环吗?

3 个答案:

答案 0 :(得分: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

答案 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

答案 2 :(得分: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)