Python如何将数据帧的两列组合成一个列表?

Mai*_*and 5 python dataframe pandas

我有一个如下所示的数据框

df = 

index    data1    data2
0         20       120
1         30       456
2         40       34
Run Code Online (Sandbox Code Playgroud)

如何将上面 df 中的两列组合成一个列表,以便第一行元素先出现,然后是第二行。

我的预期输出

my_list = [20,120,30,456,40,34]
Run Code Online (Sandbox Code Playgroud)

我的代码:

list1 = df['data1'].tolist()
list2 = df['data2'].tolist()

my_list = list1+list2
Run Code Online (Sandbox Code Playgroud)

这不起作用?

ALo*_*llz 5

底层的 numpy 数组被组织起来,array([[row1], [row2], ..., [rowN]])所以我们可以ravel,这应该非常快。

df[['data1', 'data2']].to_numpy().ravel().tolist()
#[20, 120, 30, 456, 40, 34]
Run Code Online (Sandbox Code Playgroud)

因为我很感兴趣:这里是所有建议的方法,还有另一个带链的方法,以及从 2 列与 DataFrame 长度进行输出的一些时间。

import perfplot
import pandas as pd
import numpy as np
from itertools import chain

perfplot.show(
    setup=lambda n: pd.DataFrame(np.random.randint(1, 10, (n, 2))), 
    kernels=[
        lambda df: df[[0, 1]].to_numpy().ravel().tolist(),
        lambda df: [x for i in zip(df[0], df[1]) for x in i],
        lambda df: [*chain.from_iterable(df[[0,1]].to_numpy())],
        lambda df: df[[0,1]].stack().tolist()  #  proposed by @anky_91
    ],
    labels=['ravel', 'zip', 'chain', 'stack'],
    n_range=[2 ** k for k in range(20)],
    equality_check=np.allclose,  
    xlabel="len(df)"
)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


U10*_*ard 4

这是行不通的,因为它不会按相同的索引添加,请使用以下列表理解:

print([x for i in zip(df['data1'], df['data2']) for x in i])
Run Code Online (Sandbox Code Playgroud)