পান্ডায় ডেটাফ্রেমগুলি থেকে অসীম মানগুলি বাদ দেওয়া হচ্ছে?


219

পুনরায় সেট না করে কোনও পান্ডাস ডেটা ফ্রেম থেকে ন্যান এবং ইনফ / ইনফ মানগুলি ফেলে দেওয়ার দ্রুত / সহজতম উপায় mode.use_inf_as_nullকী? আমি নিখোঁজ হিসাবে বিবেচিত মানগুলি বাদ দিয়ে, যুক্তি subsetএবং howতর্কগুলি ব্যবহার করতে সক্ষম হতে চাই:dropnainf

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

এটা কি সম্ভব? অনুপস্থিত মানগুলির সংজ্ঞাটিতে dropnaঅন্তর্ভুক্ত করার জন্য কি বলার উপায় আছে inf?

উত্তর:


416

সবচেয়ে সহজ উপায় replaceহ'ল প্রথম এনএএনএফ-ইনফেস করা:

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

একই পদ্ধতিটি সিরিজের জন্য কাজ করবে।


2
একটি নির্দিষ্ট কলামে যেমন infএকটি পূর্বনির্ধারিত মানগুলিকে কীভাবে "বিনিময়" করতে পারে ? int0
3kstc

4
@ 3 কেএসটিসি ব্যবহার .replace(..., 0)। কেবলমাত্র কলামগুলিতে করতে আপনি সেই কলামগুলি আপডেট করেন যেমনdf[cols] = df[cols].replace(..., 0)
অ্যান্ডি হেডেন

3
সম্ভবত এটি replaceস্থানে কাজ করে না তা উল্লেখ করার মতো মূল্য রয়েছে , সুতরাং একটি নতুন DataFrameফিরিয়ে দেওয়া হয়েছে
মার্কো

36

বিকল্প প্রসঙ্গে, স্থায়ীভাবে সেট না করেই এটি সম্ভব use_inf_as_na। উদাহরণ স্বরূপ:

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

অবশ্যই এটি স্থায়ীভাবে infহিসাবে আচরণ হিসাবে সেট করা যেতে পারেNaN

pd.set_option('use_inf_as_na', True)

পুরোনো সংস্করণগুলি জন্য প্রতিস্থাপন use_inf_as_naসঙ্গে use_inf_as_null


6
এটি সর্বাধিক পঠনযোগ্য উত্তর এবং ফলস্বরূপ এটি সেরা প্রশ্ন, যদিও এটি চিঠিতে (তবে আত্মায় নয়) মূল প্রশ্নটি লঙ্ঘন করে।
আইজোসেফ

2
(কমপক্ষে) 0.24 এর হিসাবে পান্ডাসকে অবহেলা করা use_inf_as_nullহয়েছিল এবং ভবিষ্যতের সংস্করণে সরানো হবে। use_inf_as_naপরিবর্তে ব্যবহার করুন। উত্তর / আপডেট যুক্ত করবেন?
হাকন টি।

1
infঅপারেশনাল স্তরের পরিবর্তে বৈশ্বিক সেটিং স্তরে নাল হিসাবে বিবেচনা করার জন্য এটি এক আরও ভাল পছন্দ । এটি সম্ভাব্যভাবে প্রথমে মানগুলিকে বোঝাতে সময় সাশ্রয় করতে পারে।
টাওপিআর

15

.locএকটি সিরিজে ইন-এর সাথে ইনফ প্রতিস্থাপনের জন্য এখানে আরও একটি পদ্ধতি ব্যবহার করা হয়েছে:

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

11

ব্যবহার করুন (দ্রুত এবং সহজ):

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

এই উত্তরটি একটি অন্য প্রশ্নের ডগআরের উত্তরের ভিত্তিতে । এখানে একটি উদাহরণ কোড:

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

7

তবুও আরেকটি সমাধান হ'ল isinপদ্ধতিটি ব্যবহার করা । প্রতিটি মান অসীম বা অনুপস্থিত কিনা তা নির্ধারণ করতে এটি ব্যবহার করুন এবং তারপরে allসারিগুলির সমস্ত মান অসীম বা অনুপস্থিত কিনা তা নির্ধারণের জন্য পদ্ধতিটি শৃঙ্খলাবদ্ধ করুন ।

অবশেষে, বুলিয়ান ইনডেক্সের মাধ্যমে সমস্ত অসীম বা অনুপস্থিত মান নেই এমন সারিগুলি নির্বাচন করতে ফলাফলটির অবহেলা ব্যবহার করুন।

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

7

উপরের সমাধানটি infলক্ষ্য কলামগুলিতে নেই এমনগুলি সংশোধন করবে । যে প্রতিকার করতে,

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

3
অজগর ২.7 এবং উচ্চতর সমর্থন ডিক {v: lst for v in cols}
বোঝাপড়া

4

আপনি pd.DataFrame.maskসাথে ব্যবহার করতে পারেন np.isinf। আপনার ডেটাফ্রেম সিরিজটি প্রথমে প্রকারের তা নিশ্চিত করা উচিত 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.