Pandas DataFrameからリストのリストへ


113

リストのリストをパンダデータフレームに変換するのは簡単です。

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]]

回答:


174

基本となる配列にアクセスして、そのtolistメソッドを呼び出すことができます。

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

L出力にが追加されるのはなぜですか?
Kunal Vyas 2016年

1
Lは、intではなくlongを意味します。
user48956 2016


1
注、これは列の順序を保持しません。要注意
ラッセルレゴ

3
列の順序が保持されない理由はありません。
Yohan Obadia

15

データに保持したい列ラベルとインデックスラベルがある場合、いくつかのオプションがあります。

データの例:

>>> 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]]

1つのアプローチは、DataFrameをjson に変換してからdf.to_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]]

1
マルチレベルインデックスがある場合、インデックスタプルは生成された行の最初の要素になります。それを分割するには、さらにステップが必要です。
Konstantin

それは使用する方が簡単ではないでしょうDataFrame.itertuples()か、DataFrame.to_records()このすべてのために?
AMC

@AMCたぶん、わからない、たぶん?あなたは自分の答えにその考えの適切な扱いを加えてみませんか?
Andrew E

@AndrewEええと、それはまだ既存の答えを議論して改善する価値があります。
AMC

5

それがあなたのニーズに合うかどうかはわかりませんが、次のこともできます:

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

これは、ndarrayモジュールの単純な配列であり、通常の配列のすべてを行うことができます。


1
プラス1. 実際には、多くの場合、NumPy配列をリストのリストに変換する必要はありません。
jpp

5

インデックスを保持したかったので、この解決策に元の答えを採用しました。

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

これで、別の場所に貼り付けることができ(たとえば、スタックオーバーフローの質問に貼り付ける)、後で再作成できます。

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


1

注: Pandas SeriesまたはDataFrameをNumPy配列またはプレーンなPythonリストに変換する必要がないStack Overflowで多くの場合を見てきました。ライブラリを初めて使用する場合は、必要な機能がすでにPandasオブジェクトによって提供されているかどうかを再確認することを検討してください。

@jppでコメントを引用するには:

実際には、多くの場合、NumPy配列をリストのリストに変換する必要はありません。


Pandas DataFrame / Seriesが機能しない場合は、組み込みDataFrame.to_numpyおよびSeries.to_numpyメソッドを使用できます。


1
この答えはあなた自身の信念に過ぎません。そして率直に言って、それは少し恥ずかしいことです。データフレームをリスト/配列に変換する正当な理由は完全にありますが、上級ユーザーならきっとご存知でしょう。
Nicolas Gervais

@NicolasGervais少々多すぎるかもしれませんが、一般化を少なくするために編集します。データフレームをリスト/配列に変換する正当な理由はもちろんあります。もちろん、私の答えは実際には何も反対ではありません。上級ユーザーならきっとわかるでしょう。そのジャブの要点はわかりません。多くの人々がシリーズをndarraysまたはリストに変換し、ndarraysをリストに変換していることに気づいた後、私はこの回答を書きました。
AMC

for elem in some_series.values.tolist():シリーズの要素を繰り返し処理できることを知らないため、非常に露骨なケースについて言及しています。この答えについて何がひどいのかわかりません。
AMC

0

これは非常に簡単です:

import numpy as np

list_of_lists = np.array(df)

これはDataFrame.valuesorの使用とどう違うのDataFrame.to_numpy()ですか?単純なPythonリストではなく、NumPy配列を作成することを気にしないでください。
AMC

-1

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) 

指定されたデータフレームの各行をリストに正常に抽出できます


DFが大きくなる一度それがアンチパターンと遅いので、これは良いアイデアではない、df.iterrowsを使用して回避しよう:stackoverflow.com/questions/16476924/...
デレク・O
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.