以下の両方の例は同じエラーで失敗します
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:なし
これはかなり非慣用的であり、ここではほとんど自分でやっています。 リスト/タプルを使用するだけで実行できます
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のスカラー(および他の反復可能)の設定をサポートすることをサポートする可能性があります。 ただし、少し注意が必要です。
最も参考になるコメント
同じ問題に遭遇し、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を格納しようとすると、私が直面している特定の問題に意味があるという問題が発生しました。そのため、彼はこの要求に完全に対応しているわけではありません。