将Python Pandas数据框扁平化为列表
我有一个像这样的数据框:
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()
这个方法,下面的评论中有提到。