多列DataFrame转为列表

5
如何在下面的数据帧中添加一个包含当前列列表'bar4': [[5,1,11],[6,2,22],[5,3,33]]的新列。
import pandas as pd

foo1 = (['L1','L1','L2'])
foo2 = ([5,5,6])
foo3 = ([1,1,2])

index = pd.MultiIndex.from_arrays(
    [foo1,foo2,foo3], names=['ifoo1','ifoo2','ifoo3']
    )
init = pd.DataFrame({
    'bar1': [5,6,5],
    'bar2': [1,2,3],
    'bar3': [11,22,33]
    }, index=index)

我最初认为这将类似于 init['barX'] = init.bar1 + init.bar2 的操作,但 int['bar4'] = init.bar1, init.bar2, init.bar3 明显不是解决方案。

期望结果:

 #                 bar1  bar2 bar3 bar4
 # foo1 foo2 foo3
 # L1   5    1      5    1    11   [5,1,11]
 # L1   5    1      6    2    22   [6,2,22]
 # L2   6    2      5    3    33   [5,3,33]
2个回答

9

我认为你需要通过values方法将值转换为numpy array,再使用numpy.ndarray.tolist方法:

init['bar4'] = init.values.tolist()
print (init)
                   bar1  bar2  bar3        bar4
ifoo1 ifoo2 ifoo3                              
L1    5     1         5     1    11  [5, 1, 11]
            1         6     2    22  [6, 2, 22]
L2    6     2         5     3    33  [5, 3, 33]

如果需要指定列:

cols = ['bar1','bar2','bar3']
init['bar4'] = init[cols].values.tolist()
print (init)
                   bar1  bar2  bar3        bar4
ifoo1 ifoo2 ifoo3                              
L1    5     1         5     1    11  [5, 1, 11]
            1         6     2    22  [6, 2, 22]
L2    6     2         5     3    33  [5, 3, 33]

2
最简单的方法可能就是在基础的NumPy ndarray上使用tolist()
init['bar4'] = init.values.tolist()

如果您需要指定数据的一部分列,则可以这样做:
init['bar4'] = init.loc[:, 'bar1':'bar3'].values.tolist()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接