如何最好地将包含列表或元组的Pandas列提取到多个列中

时间:2017-12-27 22:35:45

标签: python pandas

我不小心用一个错误副本的链接关闭了这个问题。这是正确的:Pandas split column of lists into multiple columns

假设我有一个数据框,其中一列是一个列表(已知且相同的长度)或元组,例如:

df1 = pd.DataFrame(
 {'vals': [['a', 'b', 'c', 'd'],['e','f','g','h']]}
)

即:

    vals
0   [a, b, c, d]
1   [e, f, g, h]

我想将“vals”中的值添加到单独的命名列中。我可以通过遍历行来笨拙地做到这一点:

for i in range(df1.shape[0]):
   for j in range(0,4):
      df1.loc[i, 'vals_'+j] = df1.loc[i, 'vals'] [j]

根据需要得出结果:

    vals            vals_0  vals_1  vals_2  vals_3
0   [a, b, c, d]    a       b       c       d 
1   [e, f, g, h]    e       f       g       h

是否有整洁(矢量化)方式?我尝试使用[]但是我收到了错误。

   for j in range (0,4)
       df1['vals_'+str(j)] = df1['vals'][j]

给出:

ValueError: Length of values does not match length of index

看起来Pandas试图将[]运算符应用于系列/数据帧而不是列内容。

2 个答案:

答案 0 :(得分:6)

您可以将assignapplypd.Series

一起使用
df1.assign(**df1.vals.apply(pd.Series).add_prefix('val_'))

更快的数据方法是使用.values和tolist()与数据帧构造函数:

df1.assign(**pd.DataFrame(df1.vals.values.tolist()).add_prefix('val_'))

输出:

           vals val_0 val_1 val_2 val_3
0  [a, b, c, d]     a     b     c     d
1  [e, f, g, h]     e     f     g     h

答案 1 :(得分:5)

您可以将Series初始值设定项应用于vals,然后应用add_prefix以获取您正在寻找的列名称。然后concat到原始的所需输出:

pd.concat([df1.vals, df1.vals.apply(pd.Series).add_prefix("vals_")], axis=1)

           vals vals_0 vals_1 vals_2 vals_3
0  [a, b, c, d]      a      b      c      d
1  [e, f, g, h]      e      f      g      h