Pandas: فشل تخزين إملاء في DataFrame

تم إنشاؤها على ٤ أكتوبر ٢٠١٧  ·  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)]

من الممكن الحصول على الإملاء مباشرة في إطار البيانات باستخدام بنية غير أنيقة للغاية مثل هذا:

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: لا شيء

Indexing

التعليق الأكثر فائدة

واجهت نفس المشكلة ، وكان لديها فكرتان:

يعد تخزين الإملاء داخل 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. لقد واجهت مشكلة حيث كانت محاولة تخزين إملاء لعنصر من عناصر إطار البيانات باستخدام بناء الجملة هذا منطقيًا للمشكلة المعينة التي كنت أواجهها ، لذلك فهو ليس بمفرده تمامًا مع هذا الطلب.

ال 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

واجهت نفس المشكلة ، وكان لديها فكرتان:

يعد تخزين الإملاء داخل 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. يمكننا / يجب أن نحقق في دعم وضع مقاييس للإملاءات بشكل أفضل (وغيرها من العناصر التكرارية). على الرغم من صعوبة بعض الشيء.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات