web-dev-qa-db-ja.com

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

複数のリストを受け取り、それらを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つのリスト)のパンダデータフレームを取得する方法を教えてください。

119
jfalkson

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

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

より高性能な解決策が必要な場合は、最初の試みのようにZipではなくnp.column_stackを使用できますが、ここでの例では約2倍のスピードアップになりますが、私の意見では読みやすさのコストが少しかかります。

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

ここに 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'])
35
Abhinav Gupta

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

pd.DataFrame(list(map(list, Zip(lst1,lst2,lst3))))
9
Aditya Guru

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

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

上記の答えに加えて、我々はその場で作成することができます

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

それが役に立てば幸い !

1
Vivek Ananthan

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

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,s3,s3], axis=1)

percentile_list
Out[32]: 
    lst1Title  lst3Title  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
...
0
dabru