说我有一个数据框:
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
我该怎么做?
答案 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)