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 لكنه لا.
يرجى الاطلاع على المقارنات التالية.
على العكس من ذلك ، تعمل الرموز التالية كما هو متوقع.
( الاختلاف الوحيد هو الاختيار عن طريق 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
عندما يتم تحديد عمود واحد فقط باستخدام 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()
الالتزام: لا شيء
بيثون: 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: لا شيء
أنت تملأ نسخة. استخدام 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 لتكييفها في المستقبل.
يبدو وكأنه خطأ.
التعليق الأكثر فائدة
ليس فقط عدة أعمدة ، ولكن أيضًا عمود واحد.
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
لا تعمل
لكن
df.loc[df.id==123, 'num'] = 123
إنها تعمل
لماذا لا تقوم بتحرير وظيفة fillna لتكييفها في المستقبل.
يبدو وكأنه خطأ.