Pandas:将列表的列转换为单个列表

Pau*_*aul 6 python pandas

我有一个列表数据框,看起来与下面的类似(图a)。有一个键列,后跟包含列表的n列。我的目标是,对于每一行,我将把每列的列表(不包括键)合并到新列 中的单个列表中combined。我想要的结果的一个例子如下图 B 所示。

我已经尝试了一些使用 iteritems() 的方法,但是这些数据帧可能有数十万到数百万行长,这使得它非常慢。所以我试图避免使用它的解决方案。

我想使用类似这篇 SO post中看到的列表理解之类的东西,但我无法让它与 pandas 一起使用。

# example data
data = {'key': ['1_1', '1_2', '1_3'],
        'valueA': [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]],
        'valueB': [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]],
        'valueN': [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]}
dataSet = pd.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)

图A

在此输入图像描述

图B

在此输入图像描述

编辑:我真的很感谢到目前为止我得到的所有答案!我目前正在对我的全尺寸数据集进行检查并计时,以便我可以找出在这种情况下哪个最有效。我很快就会更新我的结果!

编辑 2:我在一些较大的数据集上测试了此处提供的主要解决方案,它们的平均时间如下。

# Lambda/Apply a nested list comprehension
shakiba.mrd: 1.12 s

# Sum columns
jfaccioni: 2.21 s

# Nested list comprehension with iterrows
mozway: 0.95 s

# Adding column lists together
politinsa: 3.50 s
Run Code Online (Sandbox Code Playgroud)

再次感谢大家的贡献!

pol*_*nsa 5

您可以在 python 中添加列表

df['combined'] = df['valueA'] + df['valueB'] + df['valueN']
Run Code Online (Sandbox Code Playgroud)

或者对于多列:

df['combined'] = [[] for _ in range(len(df))]
for letter in ['A', 'B', 'C', ...., 'N']:
    df['combined'] += df[f'value{letter}']
Run Code Online (Sandbox Code Playgroud)


moz*_*way 2

您可以使用嵌套列表理解:

\n
dataSet['combined'] = [[e for l in x for e in l]\n                       for _,x in dataSet.filter(like='value').iterrows()]\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
   key                    valueA                    valueB                    valueN                                                                  combined\n0  1_1        [1, 2, 3, 4, 5, 6]        [1, 2, 3, 4, 5, 6]        [1, 2, 3, 4, 5, 6]                    [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]\n1  1_2     [7, 8, 9, 10, 11, 12]     [7, 8, 9, 10, 11, 12]     [7, 8, 9, 10, 11, 12]           [7, 8, 9, 10, 11, 12, 7, 8, 9, 10, 11, 12, 7, 8, 9, 10, 11, 12]\n2  1_3  [13, 14, 15, 16, 17, 18]  [13, 14, 15, 16, 17, 18]  [13, 14, 15, 16, 17, 18]  [13, 14, 15, 16, 17, 18, 13, 14, 15, 16, 17, 18, 13, 14, 15, 16, 17, 18]\n
Run Code Online (Sandbox Code Playgroud)\n

重复添加的时间比较(100行,100列,每个列表1000个项目):

\n
# repeated addition of the lists\n8.66 s \xc2\xb1 309 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\n# nested list comprehension\n729 ms \xc2\xb1 285 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n
Run Code Online (Sandbox Code Playgroud)\n