it-swarm.asia

إسقاط القيم لانهائية من dataframes في الباندا؟

ما هي أسرع/أبسط طريقة لإسقاط قيم nan و inf/-inf من الباندا DataFrame دون إعادة mode.use_inf_as_null؟ أريد أن أكون قادرًا على استخدام الوسيطتين subset و howdropna ، باستثناء قيم inf التي تعتبر مفقودة ، مثل:

df.dropna(subset=["col1", "col2"], how="all", with_inf=True)

هل هذا ممكن؟ هل هناك طريقة لإخبار dropna بتضمين inf في تعريفه للقيم المفقودة؟

147
user248237dfsf

أبسط طريقة هي أولاً replace infs إلى NaN:

df.replace([np.inf, -np.inf], np.nan)

ثم استخدم dropna :

df.replace([np.inf, -np.inf], np.nan).dropna(subset=["col1", "col2"], how="all")

فمثلا:

In [11]: df = pd.DataFrame([1, 2, np.inf, -np.inf])

In [12]: df.replace([np.inf, -np.inf], np.nan)
Out[12]:
    0
0   1
1   2
2 NaN
3 NaN

نفس الطريقة ستعمل مع سلسلة.

283
Andy Hayden

باستخدام سياق الخيار ، يكون هذا ممكنًا دون إعداد use_inf_as_null نهائيًا. فمثلا:

with pd.option_context('mode.use_inf_as_null', True):
    df = df.dropna(subset=['col1', 'col2'], how='all')

بالطبع يمكن ضبطه على معاملة inf كـ NaN بشكل دائم مع pd.set_option('use_inf_as_null', True) أيضًا.

16
ayhan

إليك طريقة أخرى تستخدم .loc لاستبدال الوقود النووي المشع بالرمز nan على السلسلة:

s.loc[(~np.isfinite(s)) & s.notnull()] = np.nan

لذلك ، ردًا على السؤال الأصلي:

df = pd.DataFrame(np.ones((3, 3)), columns=list('ABC'))

for i in range(3): 
    df.iat[i, i] = np.inf

df
          A         B         C
0       inf  1.000000  1.000000
1  1.000000       inf  1.000000
2  1.000000  1.000000       inf

df.sum()
A    inf
B    inf
C    inf
dtype: float64

df.apply(lambda s: s[np.isfinite(s)].dropna()).sum()
A    2
B    2
C    2
dtype: float64
15
Alexander

سيقوم الحل أعلاه بتعديل infs غير الموجودة في الأعمدة الهدف. لعلاج ذلك ،

lst = [np.inf, -np.inf]
to_replace = {v: lst for v in ['col1', 'col2']}
df.replace(to_replace, np.nan)
7
has2k1

حل آخر هو استخدام الأسلوب isin. استخدمه لتحديد ما إذا كانت كل قيمة غير محدودة أو مفقودة ، ثم قم بتسلسل الأسلوب all لتحديد ما إذا كانت جميع القيم الموجودة في الصفوف غير محدودة أو مفقودة.

أخيرًا ، استخدم نفي تلك النتيجة لتحديد الصفوف التي لا تحتوي على جميع القيم اللانهائية أو المفقودة عبر فهرسة منطقية.

all_inf_or_nan = df.isin([np.inf, -np.inf, np.nan]).all(axis='columns')
df[~all_inf_or_nan]
6
Ted Petrou

يمكنك استخدام pd.DataFrame.mask مع np.isinf . يجب عليك التأكد أولاً من أن سلسلة dataframe الخاصة بك كلها من النوع float. ثم استخدم dropna مع المنطق الحالي الخاص بك.

print(df)

       col1      col2
0 -0.441406       inf
1 -0.321105      -inf
2 -0.412857  2.223047
3 -0.356610  2.513048

df = df.mask(np.isinf(df))

print(df)

       col1      col2
0 -0.441406       NaN
1 -0.321105       NaN
2 -0.412857  2.223047
3 -0.356610  2.513048
2
jpp

استخدام (سريع وبسيط):

df = df[np.isfinite(df).all(1)]

تعتمد هذه الإجابة على إجابة DougR في سؤال آخر. هنا رمز المثال:

import pandas as pd
import numpy as np
df=pd.DataFrame([1,2,3,np.nan,4,np.inf,5,-np.inf,6])
print('Input:\n',df,sep='')
df = df[np.isfinite(df).all(1)]
print('\nDropped:\n',df,sep='')

النتيجة:

Input:
    0
0  1.0000
1  2.0000
2  3.0000
3     NaN
4  4.0000
5     inf
6  5.0000
7    -inf
8  6.0000

Dropped:
     0
0  1.0
1  2.0
2  3.0
4  4.0
6  5.0
8  6.0
2
Markus Dutschke