複数のリストをデータフレームに取り込む


164

複数のリストを取得して、それらをpythonデータフレームの異なる列として配置するにはどうすればよいですか?私はこの解決策を試しましたが、いくつかの問題がありました。

試行1:

  • 3つのリストを用意し、それらをまとめて圧縮して使用する res = zip(lst1,lst2,lst3)
  • 1列だけを生成します

試み2:

percentile_list = pd.DataFrame({'lst1Tite' : [lst1],
                                'lst2Tite' : [lst2],
                                'lst3Tite' : [lst3] }, 
                                columns=['lst1Tite','lst1Tite', 'lst1Tite'])
  • 1行3列(上記の方法)または転置した場合、3行1列になります

100行(各独立したリストの長さ)x 3列(3つのリスト)のパンダデータフレームを取得するにはどうすればよいですか?

回答:


279

私はあなたがほとんどそこにいると思います、lstの周りの余分な角括弧を削除してみてください(このようにdictからデータフレームを作成するときに列名を指定する必要もありません):

import pandas as pd
lst1 = range(100)
lst2 = range(100)
lst3 = range(100)
percentile_list = pd.DataFrame(
    {'lst1Title': lst1,
     'lst2Title': lst2,
     'lst3Title': lst3
    })

percentile_list
    lst1Title  lst2Title  lst3Title
0          0         0         0
1          1         1         1
2          2         2         2
3          3         3         3
4          4         4         4
5          5         5         5
6          6         6         6
...

あなたが最初の試みnp.column_stackよりも使用できるより高性能なソリューションが必要な場合zip、これはここの例で約2倍のスピードアップを持っていますが、私の意見では可読性のビットの犠牲になります:

import numpy as np
percentile_list = pd.DataFrame(np.column_stack([lst1, lst2, lst3]), 
                               columns=['lst1Title', 'lst2Title', 'lst3Title'])

np.column_stackビューですか、それともデータをコピーしますか?(もしコピーが、それははるかに効率的かもしれない。このように思える(O(1)ではなく、O(n))を。
user48956

@maxymoo列名をリスト名に自動的に設定できますか?
joe5

1
リストが異なるデータ型である場合、numpy列スタックはうまく機能しません
user6386155

54

Aditya Guruの答えをここに追加します。マップを使用する必要はありません。あなたは単にそれを行うことができます:

pd.DataFrame(list(zip(lst1, lst2, lst3)))

これにより、列の名前が0、1、2に設定されます。独自の列名を設定するcolumnsには、上記のメソッドにキーワード引数を渡します。

pd.DataFrame(list(zip(lst1, lst2, lst3)),
              columns=['lst1_title','lst2_title', 'lst3_title'])

3
Python 3.8およびPandas 1.0では、DataFrameが反復可能オブジェクトを期待し、zip()が反復可能オブジェクトを返すため、リスト関数を使用する必要はありません。だから、そうpd.DataFrame(zip(lst1, lst2, lst3))すべきです
Sarfraaz Ahmed

10

最初のアプローチを使用してそれを追加するだけで、次のように実行できます-

pd.DataFrame(list(map(list, zip(lst1,lst2,lst3))))

8

スケーラブルなソリューションをもう1つ追加します。

lists = [lst1, lst2, lst3, lst4]
df = pd.concat([pd.Series(x) for x in lists], axis=1)

これについて少し説明してもらえますか?
ZakS

1
シリーズを垂直に結合(連結)して(axis = 1)、リストのリストからDataFrameを作成します
yona bendelac

5

上記の回答に加えて、オンザフライで作成できます

df= pd.DataFrame()
list1 = list(range(10))
list2 = list(range(10,20))
df['list1'] = list1
df['list2'] = list2
print(df)

それが役に立てば幸い !


1

@oopsiを使用しましたpd.concat()が、列名は含まれていませんでした。次のことを行うことができます。これは、受け入れられた回答の最初の解決策とは異なり、列の順序を制御できます(順序付けされていないdictを避けます)。

import pandas as pd
lst1 = range(100)
lst2 = range(100)
lst3 = range(100)

s1=pd.Series(lst1,name='lst1Title')
s2=pd.Series(lst2,name='lst2Title')
s3=pd.Series(lst3 ,name='lst3Title')
percentile_list = pd.concat([s1,s2,s3], axis=1)

percentile_list
Out[2]: 
    lst1Title  lst2Title  lst3Title
0           0          0          0
1           1          1          1
2           2          2          2
3           3          3          3
4           4          4          4
5           5          5          5
6           6          6          6
7           7          7          7
8           8          8          8
...

1

複数のリストからデータフレームを作成する方法はいくつかあります。

list1=[1,2,3,4]
list2=[5,6,7,8]
list3=[9,10,11,12]
  1. pd.DataFrame({'list1':list1, 'list2':list2, 'list3'=list3})

  2. pd.DataFrame(data=zip(list1,list2,list3),columns=['list1','list2','list3'])


0

次のコードを簡単に使用できます

train_data['labels']= train_data[["LABEL1","LABEL1","LABEL2","LABEL3","LABEL4","LABEL5","LABEL6","LABEL7"]].values.tolist()
train_df = pd.DataFrame(train_data, columns=['text','labels'])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.