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

Posted

技术标签:

【中文标题】如何最好地将包含列表或元组的 Pandas 列提取到多个列中[重复]【英文标题】:How best to extract a Pandas column containing lists or tuples into multiple columns [duplicate] 【发布时间】:2018-06-08 12:37:20 【问题描述】:

我不小心用指向错误副本的链接关闭了这个问题。这是正确的: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 正在尝试将 [] 运算符应用于系列/数据框而不是列内容。

【问题讨论】:

df1.vals.apply(pd.Series) 将帮助您完成大部分工作。 @andrew_reece 那是矢量化的吗?他必须创作 4 个不同的系列。 【参考方案1】:

您可以使用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

【讨论】:

哇,不错的夸格福@Scott Boston! 第二种方法做所有事情的方式包括快速重命名列并且在一行中很棒。【参考方案2】:

您可以将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

【讨论】:

以上是关于如何最好地将包含列表或元组的 Pandas 列提取到多个列中[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用参数列表或元组在 pandas 中读取 SQL

Python基础(3) - 去掉列表或元组中的重复元素

Pandas 替换列中的值,但 to_replace 参数是包含元组的元组

将元组的无序列表转换为 pandas DataFrame

如何将元组列表转换为 pandas 数据框,以便每个元组的第一个值代表一列?

如何提取每个子列表中每个元组的第一个元素?