如何将数据框的一列中的值列表均等地分为多个列

时间:2019-07-20 08:00:39

标签: python pandas

说我有一个数据框:

              x

0     [0.5, 1.5, 2.5, 3.5, 4.5]
1     [5.5, 6.5, 7.5]
2     [8.5, 9.5, 10.5, 11.5]
3     [12.5, 13.5, 14.5, 15.5]

我想将值拆分为三个单独的列(每个列分别具有两个值),如下所示:

              a             b            c 

0      [0.5, 1.5]      [2.5, 3.5]      [4.5]
1      [5.5, 6.5]      [7.5]             0
2      [8.5, 9.5]      [10.5, 11.5]      0
3      [12.5, 13.5]    [14.5, 15.5]      0

我该怎么做?

2 个答案:

答案 0 :(得分:2)

首先,我认为在good idea中使用list大熊猫不是这样。

但是可以使用列表理解和自定义函数以及DataFrame构造函数:

#https://stackoverflow.com/a/312464/2901002
def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]


df1 = pd.DataFrame([list(chunks(x, 2)) for x in df['x']]).fillna(0)
print (df1)
              0             1      2
0    [0.5, 1.5]    [2.5, 3.5]  [4.5]
1    [5.5, 6.5]         [7.5]      0
2    [8.5, 9.5]  [10.5, 11.5]      0
3  [12.5, 13.5]  [14.5, 15.5]      0

答案 1 :(得分:1)

您没有提到c是在第四个元素之后还是在后面的两个元素(如果列表包含六个以上的元素)。

如果您要在c中的第四个元素之后输入所有内容,则为以下代码

df['a']=df['x'].apply(lambda x:x[:2] if len(x)>0 else 0)
df['b']=df['x'].apply(lambda x:x[2:4] if len(x)>2 else 0)
df['c']=df['x'].apply(lambda x:x[4:] if len(x)>4 else 0)
df.drop('x',axis=1,inplace=True)

或者, 即使列表中第四个元素之后还有更多内容,如果您想在c中使用两个元素,也可以使用以下代码:

df['a']=df['x'].apply(lambda x:x[:2] if len(x)>0 else 0)
df['b']=df['x'].apply(lambda x:x[2:4] if len(x)>2 else 0)
df['c']=df['x'].apply(lambda x:x[4:6] if len(x)>4 else 0)
df.drop('x',axis=1,inplace=True)