将Python Pandas数据框扁平化为列表

81 投票
5 回答
168382 浏览
提问于 2025-04-18 18:09

我有一个像这样的数据框:

import pandas
a=[['1/2/2014', 'a', '6', 'z1'], 
   ['1/2/2014', 'a', '3', 'z1'], 
   ['1/3/2014', 'c', '1', 'x3'],
   ]
df = pandas.DataFrame.from_records(a[1:],columns=a[0])

我想把这个数据框变成一个连续的列表,像这样:

['1/2/2014', 'a', '6', 'z1', '1/2/2014', 'a', '3', 'z1','1/3/2014', 'c', '1', 'x3']

我可以通过循环每一行,然后用extend方法把它们加到一个列表里,但有没有更简单的方法呢?

5 个回答

0

之前提到的 df.values.flatten().tolist()df.to_numpy().flatten().tolist() 这两种方法都很简洁有效,但我花了很长时间想要学习如何通过列表推导式自己来实现,而不使用内置函数。

如果你也感兴趣,可以试试这个:

[ row for col in df for row in df[col] ]

结果发现,这种通过列表推导式来扁平化 df 的方法(我在其他地方没有找到)其实只是对扁平化嵌套列表的解决方案做了一个小改动(这种方法在很多地方都能找到):

[ val for sublst in lst for val in sublst ]

3

你可以使用 reshape 方法。

df.values.reshape(-1)
4

你可以试试用numpy这个库。

import numpy as np
np.reshape(df.values, (1,df.shape[0]*df.shape[1]))
20

也许可以用 stack 呢?

df.stack().values
array(['1/2/2014', 'a', '3', 'z1', '1/3/2014', 'c', '1', 'x3'], dtype=object)

(补充:顺便提一下,问题中的数据框(DF)使用了第一行作为标签,所以这里的输出中没有显示这些标签。)

132

你可以在把数据表(DataFrame)转换成NumPy数组后,使用.flatten()这个方法来处理它:

df.to_numpy().flatten()

如果你想把结果变成一个Python的list(列表),你还可以加上.tolist()这个方法。

编辑

在之前的Pandas版本中,使用的是values属性,而不是.to_numpy()这个方法,下面的评论中有提到。

撰写回答