Pandas DataFrame 转换为列表嵌套列表

194

将列表嵌套转换成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]]

1
pd.DataFrame.what_to_do_now = lambda self: self.values.tolist(); lol = df.what_to_do_now(); print(lol) # [[1,2,3],[3,4,5]] 它能正常工作,如果你能相信的话。 - cs95
14个回答

0

注意:我在 Stack Overflow 上看到很多情况,将 Pandas Series 或 DataFrame 转换为 NumPy 数组或纯 Python 列表是完全不必要的。如果您是该库的新手,请考虑仔细检查您需要的功能是否已由这些 Pandas 对象提供。

引用 @jpp 的 评论

实际上,通常没有必要将 NumPy 数组转换为列表。


如果 Pandas DataFrame/Series 无法正常工作,您可以使用内置的 DataFrame.to_numpySeries.to_numpy 方法。

1
这个回答仅代表你自己的信仰,而且说实话,有点尴尬。将数据框转换为列表/数组有完全合理的原因,高级用户肯定知道。 - Nicolas Gervais
@NicolasGervais 可能有点过了,是的,我会编辑一下,减少泛化。将数据框转换为列表/数组有完全合理的理由。当然,我的回答并没有说什么相反的话。高级用户肯定知道这一点。我不明白那个讽刺的意义所在。我写这篇答案是因为我注意到很多人将系列转换为ndarrays或列表,将ndarrays转换为列表,只是因为他们不知道这些对象支持哪些操作。 - AMC
1
我指的是非常明显的情况,比如使用 for elem in some_series.values.tolist():,因为他们不知道可以迭代访问序列中的元素。我不确定这个答案有什么可怕的地方。 - AMC

0
我写了一个函数,允许包含索引列标题行
def df_to_list_of_lists(df, index=False, header=False):
    rows = []
    if header:
        rows.append(([df.index.name] if index else []) + [e for e in df.columns])
    for row in df.itertuples():
        rows.append([e for e in row] if index else [e for e in row][1:])
    return rows

0

这很简单:

import numpy as np

list_of_lists = np.array(df)

这与使用 DataFrame.valuesDataFrame.to_numpy() 有何不同?不要担心它创建的是 NumPy 数组而不是纯 Python 列表。 - AMC

-1
我们可以使用DataFrame.iterrows()函数来迭代给定数据框的每一行,并将每一行的数据构造成一个列表:
# 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) 

我们可以成功将给定数据框中的每一行提取为一个列表。

这不是一个好主意,尽量避免使用df.iterrows,因为它是反模式,并且一旦df变得很大就会变慢:https://dev59.com/h2Qn5IYBdhLWcg3w5qlg - Derek O

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接