Pandas: dictをDataFrameに保存すると失敗します

作成日 2017年10月04日  ·  3コメント  ·  ソース: pandas-dev/pandas

コードサンプル、可能であればコピーして貼り付けることができる例

以下の両方の例は同じエラーで失敗します

df = pd.DataFrame(index=[0, 1, 2], columns=['a', 'b'])

df.loc[0, 'a'] = dict(x=2)
df.iloc[0, 0] = dict(x=2)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-282-62f3ee5ff885> in <module>()
      1 # file_map.loc[file_no, 'Q_step_length'] = dict(a=1)
      2 df = pd.DataFrame(index=[0, 1, 2], columns=['a', 'b'])
----> 3 df.iloc[0, 0] = dict(x=2)
      4 df['a'] = df['a'].apply(lambda x: x[0] if not pd.isnull(x) else x)
      5 df

...\lib\site-packages\pandas\core\indexing.py in __setitem__(self, key, value)
    177             key = com._apply_if_callable(key, self.obj)
    178         indexer = self._get_setitem_indexer(key)
--> 179         self._setitem_with_indexer(indexer, value)
    180 
    181     def _has_valid_type(self, k, axis):

...\lib\site-packages\pandas\core\indexing.py in _setitem_with_indexer(self, indexer, value)
    603 
    604             if isinstance(value, (ABCSeries, dict)):
--> 605                 value = self._align_series(indexer, Series(value))
    606 
    607             elif isinstance(value, ABCDataFrame):

...\lib\site-packages\pandas\core\indexing.py in _align_series(self, indexer, ser, multiindex_indexer)
    743             return ser.reindex(ax)._values
    744 
--> 745         raise ValueError('Incompatible indexer with Series')
    746 
    747     def _align_frame(self, indexer, df):

ValueError: Incompatible indexer with Series

これは機能しますが、リストをデータフレームに配置しています

df[0, 'a'] = [dict(x=2)]

次のような非常にエレガントでない構造を使用して、データフレームで直接dictを取得することができます。

df['a'] = df['a'].apply(lambda x: x[0] if not pd.isnull(x) else x)

問題の説明

dictをデータフレームに格納することは可能であるため、上記のように割り当てを試みても失敗することはありません。 df.loc [...] = dict(...)が存在する場合、対応する列にdictの値を割り当て(文書化されていますか?)、独自の問題があることを認識していますが、この動作はアクセス時に適用されません。データフレームの単一の場所

期待される出力

指定された場所内にdictを持つデータフレーム。

pd.show_versions()の出力

インストールされたバージョン

コミット:なし
python:3.5.4.final.0
python-ビット:64
OS:Windows
OSリリース:10
マシン:AMD64
プロセッサ:Intel64ファミリ6モデル58ステッピング9、GenuineIntel
バイトオーダー:少し
LC_ALL:なし
言語:なし
ローカル:なし。なし

パンダ:0.20.3
pytest:なし
ピップ:9.0.1
setuptools:36.5.0
Cython:0.26
numpy:1.13.1
scipy:0.19.1
xarray:なし
IPython:6.1.0
スフィンクス:なし
patsy:0.4.1
dateutil:2.6.1
pytz:2017.2
blosc:なし
ボトルネック:なし
テーブル:なし
numexpr:なし
羽毛:なし
matplotlib:2.0.2
openpyxl:なし
xlrd:なし
xlwt:なし
xlsxwriter:なし
lxml:なし
bs4:なし
html5lib:0.99999999
sqlalchemy:なし
pymysql:なし
psycopg2:なし
jinja2:2.9.6
s3fs:なし
pandas_gbq:なし
pandas_datareader:なし

Indexing

最も参考になるコメント

同じ問題に遭遇し、2つの考えがありました:

DataFrame内にdictを格納することは珍しいことですが、ソフトウェアが任意のキー/値スタイルのデータを表現および操作する方法としてPandasを使用している場合があり、データはパネル表現に適した方法でインデックス付けされます。

ロケーションベースのインデックス作成が、提供された辞書のキー/値に基づいて列を更新するという動作は、私にとって驚きでした。 これは、明示的な列が参照されていない場合に意味のある便利な機能です。 たとえば、以下を提供する場合:

df.loc[row, :] = dict(key1=value1, key2=value2)

辞書のキーが列として記述されている可能性があり、 df.loc[row, key1] == value1であることは理にかなっています。 ただし、明示的な列インデックスを提供する場合、提供されたディクショナリからターゲット列を推測することは(私には)直感に反します。 代わりに提供する場合:

df.loc[row, col] = dict(key=value)

値全体をcol列に格納することを明示的に示しており、辞書はそのまま挿入されることを期待しています。

とにかく、私は@jrebackに同意しますが、これはやや非慣用的ですが、@ andreas-thomikによって提起された元の問題に同情しています。 この構文を使用してデータフレームの要素にdictを格納しようとすると、私が直面している特定の問題に意味があるという問題が発生しました。そのため、彼はこの要求に完全に対応しているわけではありません。

全てのコメント3件

これはかなり非慣用的であり、ここではほとんど自分でやっています。 リスト/タプルを使用するだけで実行できます

In [14]: df.loc[0, 'a'] = [dict(x=2)]

In [15]: df
Out[15]: 
            a    b
0  [{'x': 2}]  NaN
1         NaN  NaN
2         NaN  NaN

同じ問題に遭遇し、2つの考えがありました:

DataFrame内にdictを格納することは珍しいことですが、ソフトウェアが任意のキー/値スタイルのデータを表現および操作する方法としてPandasを使用している場合があり、データはパネル表現に適した方法でインデックス付けされます。

ロケーションベースのインデックス作成が、提供された辞書のキー/値に基づいて列を更新するという動作は、私にとって驚きでした。 これは、明示的な列が参照されていない場合に意味のある便利な機能です。 たとえば、以下を提供する場合:

df.loc[row, :] = dict(key1=value1, key2=value2)

辞書のキーが列として記述されている可能性があり、 df.loc[row, key1] == value1であることは理にかなっています。 ただし、明示的な列インデックスを提供する場合、提供されたディクショナリからターゲット列を推測することは(私には)直感に反します。 代わりに提供する場合:

df.loc[row, col] = dict(key=value)

値全体をcol列に格納することを明示的に示しており、辞書はそのまま挿入されることを期待しています。

とにかく、私は@jrebackに同意しますが、これはやや非慣用的ですが、@ andreas-thomikによって提起された元の問題に同情しています。 この構文を使用してデータフレームの要素にdictを格納しようとすると、私が直面している特定の問題に意味があるという問題が発生しました。そのため、彼はこの要求に完全に対応しているわけではありません。

@aaclaytonこれは#18955に関連しています。 dictのスカラー(および他の反復可能)の設定をサポートすることをサポートする可能性があります。 ただし、少し注意が必要です。

このページは役に立ちましたか?
0 / 5 - 0 評価