将列表列表转换为pandas数据帧很容易:
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]]
答案 0 :(得分:117)
您可以访问基础数组并调用其tolist
方法:
>>> df = pd.DataFrame([[1,2,3],[3,4,5]])
>>> lol = df.values.tolist()
>>> lol
[[1L, 2L, 3L], [3L, 4L, 5L]]
答案 1 :(得分:10)
如果数据包含您要保留的列和索引标签,则有几个选项。
示例数据:
>>> 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]]
一种方法是使用DataFrame
将df.to_json()
转换为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]]
答案 2 :(得分:5)
我不知道它是否符合您的需求,但您也可以这样做:
>>> lol = df.values
>>> lol
array([[1, 2, 3],
[3, 4, 5]])
这只是ndarray模块中的一个numpy数组,它可以让你完成所有常见的numpy数组事务。
答案 3 :(得分:1)
我想保留索引,因此我将原始答案修改为该解决方案:
df.reset_index().values.tolist()
现在可以在其他地方重新创建它(例如,在Stack Overflow问题中过去):
pd.Dataframe(<data-printed-above>, columns=['name1', ...])
pd.set_index(['name1'], inplace=True)
答案 4 :(得分:1)
注意:我在Stack Overflow上看到过很多案例,其中完全不需要将Pandas Series或DataFrame转换为NumPy数组或纯Python列表。如果您是图书馆的新手,请考虑仔细检查那些Pandas对象是否已经提供了所需的功能。
用@jpp引用comment:
在实践中,通常不需要将NumPy数组转换为列表列表。
如果Pandas DataFrame / Series无法工作,则可以使用内置的DataFrame.to_numpy
和Series.to_numpy
方法。
答案 5 :(得分:1)
“ df.values”返回一个numpy数组。这不会保留数据类型。整数可能会转换为浮点数。
df.iterrows()返回一个序列,该序列也不保证保留数据类型。参见:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iterrows.html
下面的代码将转换为列表列表并保留数据类型:
onclick='document.getElementById("demo").innerText = "Hello World";'
答案 6 :(得分:1)
我遇到了这个问题:如何让 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()
答案 7 :(得分:1)
与问题不太相关,但具有相同期望的另一种口味
使用 Plotly 中的 create_distplot 将数据框系列转换为列表列表以绘制图表
hist_data=[]
hist_data.append(map_data['Population'].to_numpy().tolist())
答案 8 :(得分:0)
也许有些变化,但这会返回一个满足我需要的ndarrays列表。
list(df.values)
答案 9 :(得分:0)
我们可以使用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)
我们可以成功地将给定数据帧的每一行提取到一个列表中
答案 10 :(得分:0)
这很简单:
import numpy as np
list_of_lists = np.array(df)
答案 11 :(得分:0)
如果您希望将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']]
答案 12 :(得分:0)
如果您是图书馆的新手,请考虑仔细检查那些Pandas对象是否已经提供了所需的功能。
我的解决方案:使用to_dict()
dict_of_lists = df.to_dict(orient='split')
这将为您提供包含三个列表的字典:index
,columns
,data
。如果您确定确实不需要列名和索引名,则可以使用
dict_of_lists['data']