熊猫数据框架到列表列表

很容易把一个列表变成一个熊猫数据框:

import pandas as pd
df = pd.DataFrame([[1,2,3],[3,4,5]])

但是如何将 df 转换回列表列表呢?

lol = df.what_to_do_now?
print lol
# [[1,2,3],[3,4,5]]
208791 次浏览

您可以访问基础数组并调用它的 tolist方法:

>>> df = pd.DataFrame([[1,2,3],[3,4,5]])
>>> lol = df.values.tolist()
>>> lol
[[1L, 2L, 3L], [3L, 4L, 5L]]

我不知道它是否适合你的需要,但你也可以做:

>>> lol = df.values
>>> lol
array([[1, 2, 3],
[3, 4, 5]])

这只是 ndarray 模块中的 numpy 数组,它允许您执行所有常见的 numpy 数组操作。

如果数据具有要保留的列和索引标签,则有几个选项。

示例数据:

>>> df = pd.DataFrame([[1,2,3],[3,4,5]], \
columns=('first', 'second', 'third'), \
index=('alpha', 'beta'))
>>> df
first  second  third
alpha      1       2      3
beta       3       4      5

在其他答案中描述的 tolist()方法是有用的,但只能产生核心数据——这可能不够,取决于您的需要。

>>> df.values.tolist()
[[1, 2, 3], [3, 4, 5]]

一种方法是使用 df.to_json()DataFrame转换为 json,然后再次解析它。这很麻烦,但是确实有一些优点,因为 to_json()方法有一些有用的选项。

>>> df.to_json()
{
"first":{"alpha":1,"beta":3},
"second":{"alpha":2,"beta":4},"third":{"alpha":3,"beta":5}
}


>>> df.to_json(orient='split')
{
"columns":["first","second","third"],
"index":["alpha","beta"],
"data":[[1,2,3],[3,4,5]]
}

很麻烦,但可能有用。

好消息是,为列和行构建列表非常简单:

>>> columns = [df.index.name] + [i for i in df.columns]
>>> rows = [[i for i in row] for row in df.itertuples()]

结果是:

>>> print(f"columns: {columns}\nrows: {rows}")
columns: [None, 'first', 'second', 'third']
rows: [['alpha', 1, 2, 3], ['beta', 3, 4, 5]]

如果 None作为索引的名称很麻烦,请将其重命名为:

df = df.rename_axis('stage')

然后:

>>> columns = [df.index.name] + [i for i in df.columns]
>>> print(f"columns: {columns}\nrows: {rows}")


columns: ['stage', 'first', 'second', 'third']
rows: [['alpha', 1, 2, 3], ['beta', 3, 4, 5]]

我想保留索引,所以我改编了这个解决方案的原始答案:

list_df = df.reset_index().values.tolist()

现在你可以把它粘贴到其他地方(比如粘贴到 Stack Overflow 问题中) ,然后重新创建它:

pd.Dataframe(list_df, columns=['name1', ...])
pd.set_index(['name1'], inplace=True)

也许有些事情改变了,但是这个给了我一个 Ndarray 的列表,它做了我需要的事情。

list(df.values)

注意: 我在 Stack Overflow 上看到过很多例子,其中将 Panda Series 或 DataFrame 转换为 NumPy 数组或普通 Python 列表是完全没有必要的。如果您刚刚接触这个库,请考虑再次检查您需要的功能是否已经由那些 Panda 对象提供。

引用@jpp 的 评论:

在实践中,通常不需要将 NumPy 数组转换为列表列表。


如果熊猫 DataFrame/Series 不能工作,可以使用内置的 DataFrame.to_numpySeries.to_numpy方法。

我们可以使用 DataFrame.iterrows ()函数迭代给定 Dataframe 的每一行,并从每一行的数据中构造一个列表:

# Empty list
row_list =[]


# Iterate over each row
for index, rows in df.iterrows():
# Create list for the current row
my_list =[rows.Date, rows.Event, rows.Cost]


# append the list to the final list
row_list.append(my_list)


# Print
print(row_list)

我们可以成功地将给定数据帧的每一行提取到一个列表中

这很简单:

import numpy as np


list_of_lists = np.array(df)

“ df.values”返回一个数字数组。这不保留数据类型。一个整数可能被转换成浮点数。

Iterrows ()返回一个序列,该序列也不保证保留数据类型

下面的代码转换为列表并保留数据类型:

rows = [list(row) for row in df.itertuples()]

如果您希望将一个 Pandas DataFrame转换为一个表(列表列表) ,并包括头列,这应该工作:

import pandas as pd
def dfToTable(df:pd.DataFrame) -> list:
return [list(df.columns)] + df.values.tolist()

用法(在 REPL 中) :

>>> df = pd.DataFrame(
[["r1c1","r1c2","r1c3"],["r2c1","r2c2","r3c3"]]
, columns=["c1", "c2", "c3"])
>>> df
c1    c2    c3
0  r1c1  r1c2  r1c3
1  r2c1  r2c2  r3c3
>>> dfToTable(df)
[['c1', 'c2', 'c3'], ['r1c1', 'r1c2', 'r1c3'], ['r2c1', 'r2c2', 'r3c3']]
  1. 迄今为止提出的解决方案受到了“重造轮子”方法的影响:

如果您刚刚接触这个库,请考虑再次检查您需要的功能是否已经由那些 Panda 对象提供。

  1. 如果您将数据框架转换为列表列表,您将丢失信息-即索引和列名称。

我的解决方案: 使用 来决定()

dict_of_lists = df.to_dict(orient='split')

这将为您提供一个包含三个列表的字典: indexcolumnsdata。如果您决定确实不需要列和索引名称,那么可以使用

dict_of_lists['data']

我遇到了这样一个问题: 如何使 df 的头部位于第0行,以便将它们写入 Excel 中的第1行(使用 xlsxwriter) ?所有提出的解决方案都没有奏效,但它们为我指明了正确的方向。我只需要再写一行代码

# get csv data
df = pd.read_csv(filename)


# combine column headers and list of lists of values
lol = [df.columns.tolist()] + df.values.tolist()

与这个问题没有太大关系,但是有另一种相同期望的味道

在 Plotly 使用 create _ distplot 将数据框架系列转换为列表列表以绘制图表

    hist_data=[]
hist_data.append(map_data['Population'].to_numpy().tolist())