Pandas: BUG: لا يعمل fillna مع inplace مع اختيار أعمدة متعددة حسب loc

تم إنشاؤها على ١١ ديسمبر ٢٠١٦  ·  3تعليقات  ·  مصدر: pandas-dev/pandas

نموذج التعليمات البرمجية ، مثال يمكن نسخه ولصقه إن أمكن

df = pd.DataFrame(np.random.randn(3, 4), columns=list('ABCD'))
df.iloc[1, 2:4] = np.nan
df.loc[:, ['C', 'D']].fillna(-1, inplace=True)
display(df)

انتاج:

A   B   C   D
0   1.387547    -1.299578   0.360015    1.290783
1   -0.395182   -0.112581   NaN NaN
2   -0.649372   -1.831869   -0.103746   0.533153

وصف المشكلة

ومن المتوقع أن تعديل نان إلى -1 لكنه لا.

يرجى الاطلاع على المقارنات التالية.

المقارنة (1)

على العكس من ذلك ، تعمل الرموز التالية كما هو متوقع.
( الاختلاف الوحيد هو الاختيار عن طريق iloc أو عن طريق loc )

df = pd.DataFrame(np.random.randn(3, 4), columns=list('ABCD'))
df.iloc[1, 2:4] = np.nan
df.iloc[:, 2:4].fillna(-1, inplace=True)
display(df)

انتاج:

    A   B   C   D
0   -0.522821   -1.600520   -1.468871   0.715790
1   0.493071    0.722474    -1.000000   -1.000000
2   0.545852    -0.877946   0.993169    -0.582661

المقارنة (2)

عندما يتم تحديد عمود واحد فقط باستخدام loc ، فإنه يعمل بشكل صحيح.

df = pd.DataFrame(np.random.randn(3, 4), columns=list('ABCD'))
df.iloc[1, 2:4] = np.nan
df.loc[:, 'C'].fillna(-1, inplace=True)
display(df)

انتاج:

A   B   C   D
0   -0.549106   0.261093    -1.278554   2.017178
1   -1.424498   0.439482    -1.000000   NaN
2   -1.281520   1.190736    0.356319    0.416363

الإخراج المتوقع لعينة التعليمات البرمجية الأولى

A   B   C   D
0   1.181106    1.101231    -0.198445   0.295238
1   -0.654265   -1.129840   -1.000000   -1.000000
2   -1.070404   0.096556    0.499020    -1.835347

ناتج pd.show_versions()

الصق الناتج هنا pd.show_versions () هنا

الإصدارات المثبتة

الالتزام: لا شيء
بيثون: 3.5.2.final.0
بتات الثعبان: 64
نظام التشغيل: Linux
إصدار نظام التشغيل: 2.6.32-358.14.1.el6.x86_64
الجهاز: x86_64
المعالج: x86_64
byteorder: قليلا
LC_ALL: لا شيء
LANG: zh_TW.big5
LOCALE: zh_TW.big5

الباندا: 0.19.1
أنف: لا شيء
النقطة: 9.0.1
أدوات الإعداد: 27.2.0
سايثون: لا شيء
numpy: 1.11.2
scipy: 0.18.1
statsmodels: لا شيء
xarray: لا شيء
IPython: 5.1.0
أبو الهول: لا يوجد
باتسي: لا شيء
داتوتيل: ​​2.6.0
بيتز: 2016.10.21
blosc: لا شيء
عنق الزجاجة: لا شيء
الجداول: 3.3.0
numexpr: 2.6.1
matplotlib: 1.5.3
openpyxl: لا شيء
xlrd: لا شيء
xlwt: بلا
xlsxwriter: بلا
lxml: لا شيء
bs4: لا شيء
html5lib: لا شيء
HTplib2: لا شيء
apiclient: لا شيء
sqlalchemy: لا شيء
pymysql: لا شيء
psycopg2: لا شيء
jinja2: 2.8
boto: لا شيء
pandas_datareader: لا شيء

Indexing Missing-data Usage Question

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

ليس فقط عدة أعمدة ، ولكن أيضًا عمود واحد.
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
لا تعمل
لكن
df.loc[df.id==123, 'num'] = 123
إنها تعمل

لماذا لا تقوم بتحرير وظيفة fillna لتكييفها في المستقبل.
يبدو وكأنه خطأ.

ال 3 كومينتر

أنت تملأ نسخة. استخدام inplace هو مضاد للنمط. ستظهر معظم العمليات SettingWithCopyWarning ، لكن في هذه الحالة لا يمكن اكتشاف هذا بسهولة.

استعمال

In [11]: df[['C', 'D']] = df[['C', 'D']].fillna(-1)

In [12]: df
Out[12]: 
          A         B         C         D
0  0.236782  1.408896 -0.199882  0.803165
1 -1.763881  0.232414 -1.000000 -1.000000
2  0.878515 -0.394800  0.429696 -1.829569

جرب هذا:
df.loc [:، ['C'، 'D']] = df.loc [:، ['C'، 'D']]. fillna (-1)
كنت أواجه نفس الصعوبة مع ملف .relplace في الكود الخاص بي. نجح هذا.

ليس فقط عدة أعمدة ، ولكن أيضًا عمود واحد.
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
لا تعمل
لكن
df.loc[df.id==123, 'num'] = 123
إنها تعمل

لماذا لا تقوم بتحرير وظيفة fillna لتكييفها في المستقبل.
يبدو وكأنه خطأ.

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