从具有列表的列中创建新列

时间:2019-08-05 13:13:51

标签: python pandas

我想用pythonpandas来做到这一点。

让我们假设以下内容:

    x_position  y_position
0   [4, 2, 6]   [1, 2, 9]
1   [1, 7]      [3, 5]

最后我要拥有以下内容:

    x_position  y_position  new_0_0 new_0_1 new_1_0 new_1_1 new_2_0 new_2_1
0   [4, 2, 6]   [1, 2, 9]   4       1       2       2       6       9
1   [1, 7]      [3, 5]      1       3       7       5       Na      Na

新列不必具有诸如new_0_0之类的名称;可以是0_0,甚至可以是任何东西。

第二,如果您的代码可以用于包含列表的更多列(例如,也带有z_position列。

最有效的方法是什么?

1 个答案:

答案 0 :(得分:5)

将列表理解与DataFrame构造函数和concat一起使用,按DataFrame.sort_index的列按Multiindex的第二级进行排序,最后对MultiIndex进行展平:

print (df)
  x_position y_position z_position
0  [4, 2, 6]  [1, 2, 9]    [4,8,9]
1     [1, 7]     [3, 5]      [1,3]

comp = [pd.DataFrame(df[x].tolist()) for x in df.columns]
df1 = pd.concat(comp, axis=1, keys=range(len(df.columns))).sort_index(axis=1, level=1)
df1.columns = [f'new_{b}_{a}' for a, b in df1.columns]
print (df1)
   new_0_0  new_0_1  new_0_2  new_1_0  new_1_1  new_1_2  new_2_0  new_2_1  \
0        4        1        4        2        2        8      6.0      9.0   
1        1        3        1        7        5        3      NaN      NaN   

   new_2_2  
0      9.0  
1      NaN  

print (df.join(df1))
  x_position y_position z_position  new_0_0  new_0_1  new_0_2  new_1_0  \
0  [4, 2, 6]  [1, 2, 9]  [4, 8, 9]        4        1        4        2   
1     [1, 7]     [3, 5]     [1, 3]        1        3        1        7   

   new_1_1  new_1_2  new_2_0  new_2_1  new_2_2  
0        2        8      6.0      9.0      9.0  
1        5        3      NaN      NaN      NaN