كلا المثالين أدناه يفشلان مع نفس الخطأ
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)]
من الممكن الحصول على الإملاء مباشرة في إطار البيانات باستخدام بنية غير أنيقة للغاية مثل هذا:
df['a'] = df['a'].apply(lambda x: x[0] if not pd.isnull(x) else x)
نظرًا لأنه من الممكن تخزين ديكت في إطار بيانات ، فإن تجربة مهمة على النحو الوارد أعلاه لا ينبغي أن تفشل. أعي أن df.loc [...] = ديكت (...) سوف يعين قيمًا في الإختصار للأعمدة المقابلة إذا كان موجودًا (هل هذا موثق؟) وله مشكلات خاصة به ولكن لا ينبغي تطبيق هذا السلوك عند الوصول موقع واحد من إطار البيانات
إطار بيانات به علامة داخل الموقع المحدد.
pd.show_versions()
الالتزام: لا شيء
بيثون: 3.5.4.final.0
بتات الثعبان: 64
نظام التشغيل: Windows
إصدار نظام التشغيل: 10
الجهاز: AMD64
المعالج: Intel64 Family 6 Model 58 Stepping 9، GenuineIntel
byteorder: قليلا
LC_ALL: لا شيء
لانغ: لا شيء
LOCALE: لا شيء
الباندا: 0.20.3
بيتيست: لا شيء
النقطة: 9.0.1
أدوات الإعداد: 36.5.0
سايثون: 0.26
numpy: 1.13.1
scipy: 0.19.1
xarray: لا شيء
IPython: 6.1.0
أبو الهول: لا يوجد
باتسي: 0.4.1
داتوتيل: 2.6.1
بيتز: 2017.2
blosc: لا شيء
عنق الزجاجة: لا شيء
الجداول: لا شيء
numexpr: بلا
الريش: لا شيء
matplotlib: 2.0.2
openpyxl: لا شيء
xlrd: بلا
xlwt: بلا
xlsxwriter: بلا
lxml: لا شيء
bs4: لا شيء
html5lib: 0.9999999
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
واجهت نفس المشكلة ، وكان لديها فكرتان:
يعد تخزين الإملاء داخل DataFrame أمرًا غير معتاد ، ولكن هناك حالات صالحة حيث قد يستخدم البرنامج 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. لقد واجهت مشكلة حيث كانت محاولة تخزين إملاء لعنصر من عناصر إطار البيانات باستخدام بناء الجملة هذا منطقيًا للمشكلة المعينة التي كنت أواجهها ، لذلك فهو ليس بمفرده تمامًا مع هذا الطلب.
aaclayton هذا مرتبط بـ # 18955. يمكننا / يجب أن نحقق في دعم وضع مقاييس للإملاءات بشكل أفضل (وغيرها من العناصر التكرارية). على الرغم من صعوبة بعض الشيء.
التعليق الأكثر فائدة
واجهت نفس المشكلة ، وكان لديها فكرتان:
يعد تخزين الإملاء داخل DataFrame أمرًا غير معتاد ، ولكن هناك حالات صالحة حيث قد يستخدم البرنامج 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. لقد واجهت مشكلة حيث كانت محاولة تخزين إملاء لعنصر من عناصر إطار البيانات باستخدام بناء الجملة هذا منطقيًا للمشكلة المعينة التي كنت أواجهها ، لذلك فهو ليس بمفرده تمامًا مع هذا الطلب.