postgreSQLデータベースにデータを保存しています。私はPython2.7を使用してこのデータをクエリし、Pandas DataFrameに変換しています。ただし、このデータフレームの最後の列には、その中に値の辞書(またはリスト?)があります。DataFrameは次のようになります。
[1] df
Station ID Pollutants
8809 {"a": "46", "b": "3", "c": "12"}
8810 {"a": "36", "b": "5", "c": "8"}
8811 {"b": "2", "c": "7"}
8812 {"c": "11"}
8813 {"a": "82", "c": "15"}
この列を個別の列に分割して、DataFrameが次のようになるようにする必要があります。
[2] df2
Station ID a b c
8809 46 3 12
8810 36 5 8
8811 NaN 2 7
8812 NaN NaN 11
8813 82 NaN 15
私が抱えている主な問題は、リストが同じ長さではないということです。ただし、すべてのリストには、同じ3つの値(a、b、c)しか含まれていません。そして、それらは常に同じ順序で表示されます(1番目、b 2番目、c 3番目)。
次のコードは、機能し、私が望んでいたもの(df2)を正確に返すために使用されました。
[3] df
[4] objs = [df, pandas.DataFrame(df['Pollutant Levels'].tolist()).iloc[:, :3]]
[5] df2 = pandas.concat(objs, axis=1).drop('Pollutant Levels', axis=1)
[6] print(df2)
先週このコードを実行していたところ、問題なく動作していました。しかし、今私のコードは壊れており、[4]行目からこのエラーが発生します。
IndexError: out-of-bounds on slice (end)
コードは変更しませんでしたが、エラーが発生しています。これは、私の方法が堅牢または適切ではないためだと思います。
このリストの列を個別の列に分割する方法についての提案やガイダンスは非常に高く評価されます!
編集:私は.tolist()と.applyメソッドが1つのユニコード文字列であるため、私のコードでは機能していないと思います、すなわち:
#My data format
u{'a': '1', 'b': '2', 'c': '3'}
#and not
{u'a': '1', u'b': '2', u'c': '3'}
データはこの形式でpostgreSQLデータベースからインポートされます。この問題に関するヘルプやアイデアはありますか?ユニコードを変換する方法はありますか?
iloc[:, :3]
、3つのアイテムがあり、より最近のデータスライスには1つまたは2つしかないと想定しているのでしょうか(例:のb
ようなものはないindex 8813
)
iloc
パートを省略した場合、これはパンダ0.18.1を使用して動作します