मैं एक पंडों के डेटाफ्रेम के कॉलम में शून्य के साथ सभी NaN मानों को कैसे बदल सकता हूं


458

मेरे पास नीचे के रूप में एक डेटाफ्रेम है

      itm Date                  Amount 
67    420 2012-09-30 00:00:00   65211
68    421 2012-09-09 00:00:00   29424
69    421 2012-09-16 00:00:00   29877
70    421 2012-09-23 00:00:00   30990
71    421 2012-09-30 00:00:00   61303
72    485 2012-09-09 00:00:00   71781
73    485 2012-09-16 00:00:00     NaN
74    485 2012-09-23 00:00:00   11072
75    485 2012-09-30 00:00:00  113702
76    489 2012-09-09 00:00:00   64731
77    489 2012-09-16 00:00:00     NaN

जब मैं .apply एक कार्य राशि कॉलम के लिए प्रयास करता हूं तो मुझे निम्नलिखित त्रुटि मिलती है।

ValueError: cannot convert float NaN to integer

मैंने एक फंक्शन का उपयोग करने की कोशिश की है। मठ के मॉड्यूल से .isnan मैंने पंडों की कोशिश की है। मेरे पास .replace विशेषता की कोशिश की है। पंडों से .sparse डेटा की विशेषता 0.9 मैंने भी कोशिश की है अगर NaN == NaN एक फ़ंक्शन में कथन। मैंने इस लेख को भी देखा है मैं एक आर डेटाफ्रेम में एनए मान को शून्य के साथ कैसे बदल सकता हूं? कुछ अन्य लेखों को देखते हुए। मेरे द्वारा आजमाए गए सभी तरीकों ने NaN को काम नहीं किया है या नहीं पहचाना है। किसी भी संकेत या समाधान की सराहना की जाएगी।


एकमात्र समस्या df.fill.na () काम नहीं करती है यदि डेटा फ्रेम जिस पर आप इसे लागू कर रहे हैं, उसे हल किया गया है या लोक फ़ंक्शन के माध्यम से कटा हुआ है
प्रिंस अग्रवाल

जवाबों:


754

मुझे विश्वास है DataFrame.fillna()कि यह आपके लिए करेगा।

डेटाफ़्रेम और एक श्रृंखला के लिए डॉक्स से लिंक करें ।

उदाहरण:

In [7]: df
Out[7]: 
          0         1
0       NaN       NaN
1 -0.494375  0.570994
2       NaN       NaN
3  1.876360 -0.229738
4       NaN       NaN

In [8]: df.fillna(0)
Out[8]: 
          0         1
0  0.000000  0.000000
1 -0.494375  0.570994
2  0.000000  0.000000
3  1.876360 -0.229738
4  0.000000  0.000000

केवल एक कॉलम में NaN भरने के लिए, बस उस कॉलम का चयन करें। इस मामले में मैं inplace = true का उपयोग कर रहा हूँ वास्तव में df की सामग्री को बदलने के लिए।

In [12]: df[1].fillna(0, inplace=True)
Out[12]: 
0    0.000000
1    0.570994
2    0.000000
3   -0.229738
4    0.000000
Name: 1

In [13]: df
Out[13]: 
          0         1
0       NaN  0.000000
1 -0.494375  0.570994
2       NaN  0.000000
3  1.876360 -0.229738
4       NaN  0.000000

संपादित करें:

से बचने के लिए SettingWithCopyWarning, स्तंभ-विशिष्ट कार्यक्षमता में निर्मित का उपयोग करें:

df.fillna({1:0}, inplace=True)

1
क्या यह गारंटी है कि df[1]मूल DF की एक प्रति के बजाय एक दृश्य है? जाहिर है, अगर वहाँ एक दुर्लभ स्थिति है जहाँ यह एक प्रति है, यह एक सुपर परेशानी का कारण होगा बग। क्या पंडों के प्रलेखन में उस पर स्पष्ट कथन है?
अधिकतम

@ मिक्स इसे देखें, अपने प्रश्न को संबोधित कर सकते हैं: stackoverflow.com/questions/23296282/…
अमन

धन्यवाद। क्या मेरी समझ सही है कि उस उत्तर में "इंडेक्सर जो सेट करता है" सबसे बाहरी इंडेक्सिंग ऑपरेशन है (असाइनमेंट से ठीक पहले निष्पादित किया गया है। इसलिए कोई भी असाइनमेंट जो केवल एक इंडेक्सर का उपयोग करता है, सुरक्षित होने की गारंटी देता है, आपके कोड को सुरक्षित बनाता है?
अधिकतम

1
यह मेरे लिए काम क्यों नहीं कर रहा है? देखें: stackoverflow.com/questions/39452095/how-to-fillna-with-value-0
displayname

1
अंतिम उदाहरण एक SettingWithCopyWarning फेंकता है
Sip

124

यह गारंटी नहीं है कि स्लाइसिंग एक दृश्य या एक प्रति लौटाता है। तुम कर सकते हो

df['column'] = df['column'].fillna(value)

14
बस "Inplace = True" समस्या की खोज की। यह उत्तर समस्या से बचता है और मुझे लगता है कि प्रस्तुत सबसे साफ समाधान है।
13

48

आप replaceइसे बदलने के NaNलिए उपयोग कर सकते हैं 0:

import pandas as pd
import numpy as np

# for column
df['column'] = df['column'].replace(np.nan, 0)

# for whole dataframe
df = df.replace(np.nan, 0)

# inplace
df.replace(np.nan, 0, inplace=True)

क्या यह केवल प्रतिस्थापित करेगा NaN? या यह भी मूल्य की जगह कहाँ NAया NaNपसंद करेंगे df.fillna(0)? मैं ऐसे समाधान की तलाश कर रहा हूं जो केवल मूल्य को प्रतिस्थापित करता है जहां नहीं है NaNऔर नहींNA
श्याम भीमनी

1
@ShyamBhimani को केवल उन्हीं NaNमूल्यों को प्रतिस्थापित करना चाहिए जहां np.isnanसत्य है
एंटोन प्रोतोपोपोव

23

मैं सिर्फ एक अद्यतन / विशेष मामला प्रदान करना चाहता था क्योंकि ऐसा लगता है कि लोग अभी भी यहाँ आते हैं। यदि आप एक मल्टी-इंडेक्स का उपयोग कर रहे हैं या अन्यथा इंडेक्स-स्लाइसर का उपयोग कर रहे हैं, तो आपके द्वारा चुने गए स्लाइस को अपडेट करने के लिए सही विकल्प पर्याप्त नहीं हो सकता है। उदाहरण के लिए एक 2x2 स्तर के बहु-सूचकांक में यह कोई मान नहीं बदलेगा (जैसा कि पांडा 0.15)

idx = pd.IndexSlice
df.loc[idx[:,mask_1],idx[mask_2,:]].fillna(value=0,inplace=True)

"समस्या" यह है कि मूल डेटाफ़्रेम को अद्यतन करने के लिए चेनिंग भरण क्षमता को तोड़ता है। मैंने उद्धरणों में "समस्या" डाल दी क्योंकि डिजाइन के निर्णयों के अच्छे कारण हैं जिनके कारण कुछ परिस्थितियों में इन जंजीरों के माध्यम से व्याख्या नहीं की गई। इसके अलावा, यह एक जटिल उदाहरण है (हालांकि मैं वास्तव में इसमें भाग गया था), लेकिन यह उसी स्लाइस के आधार पर सूचकांक के कम स्तरों पर लागू हो सकता है।

इसका समाधान है DataFrame.update:

df.update(df.loc[idx[:,mask_1],idx[[mask_2],:]].fillna(value=0))

यह एक पंक्ति है, बहुत अच्छी तरह से पढ़ता है (सॉर्ट करता है) और आपको किसी भी बहु-स्तरीय स्लाइस को भरने के लिए अनुमति देते समय मध्यवर्ती चर या छोरों के साथ किसी भी अनावश्यक खिलवाड़ को समाप्त करता है!

अगर कोई भी ऐसी जगह पा सकता है जो टिप्पणियों में काम नहीं करती है, तो मैं इसके साथ खिलवाड़ कर रहा हूं और स्रोत को देख रहा हूं और यह कम से कम मेरी बहु-सूचकांक स्लाइस समस्याओं को हल करने के लिए लगता है।



7

गुम मूल्यों को भरने का आसान तरीका: -

स्ट्रिंग कॉलम भरना : जब स्ट्रिंग कॉलम में लापता मान और NaN मान होते हैं।

df['string column name'].fillna(df['string column name'].mode().values[0], inplace = True)

संख्यात्मक कॉलम भरना : जब संख्यात्मक कॉलम में मान और NaN मान न हों।

df['numeric column name'].fillna(df['numeric column name'].mean(), inplace = True)

शून्य के साथ NaN भरना:

df['column name'].fillna(0, inplace = True)

5

आप सभी डीएफ को कुछ वनवैल्यू को भरने के लिए DataFrame में विशिष्ट कॉलम के NaN मानों को भरने के लिए शब्दकोशों का भी उपयोग कर सकते हैं।

import pandas as pd

df = pd.read_excel('example.xlsx')
df.fillna( {
        'column1': 'Write your values here',
        'column2': 'Write your values here',
        'column3': 'Write your values here',
        'column4': 'Write your values here',
        .
        .
        .
        'column-n': 'Write your values here'} , inplace=True)

यह ओपी के प्रश्न का डेवलपर-इच्छित समाधान है।
जॉनडैंगर

4

यहां छवि विवरण दर्ज करें

Amountउपरोक्त तालिका में विशेष कॉलम को देखते हुए पूर्णांक प्रकार है। निम्नलिखित एक समाधान होगा:

df['Amount'] = df.Amount.fillna(0).astype(int)

इसी तरह, आप इसे विभिन्न डेटा प्रकारों जैसे float, strऔर इसी तरह भर सकते हैं ।

विशेष रूप से, मैं एक ही कॉलम के विभिन्न मूल्यों की तुलना करने के लिए डेटाटाइप पर विचार करूंगा।


2

पंडों में ना मूल्यों को बदलने के लिए

df['column_name'].fillna(value_to_be_replaced,inplace=True)

अगर inplace = False, बजाय df (डेटाफ्रेम) को अपडेट करने के, यह संशोधित मान लौटाएगा।


1

यदि आप इसे पंडों के डेटाफ्रेम में बदलना चाहते हैं, तो आप इसका उपयोग करके भी इसे पूरा कर सकते हैं fillna

import numpy as np
df=np.array([[1,2,3, np.nan]])

import pandas as pd
df=pd.DataFrame(df)
df.fillna(0)

यह निम्नलिखित लौटाएगा:

     0    1    2   3
0  1.0  2.0  3.0 NaN
>>> df.fillna(0)
     0    1    2    3
0  1.0  2.0  3.0  0.0

1

मुख्य रूप से दो विकल्प उपलब्ध हैं; केवल संख्यात्मक प्रतिस्थापन (स्तंभ के पार) के साथ अनुपलब्ध मानों की अनुपस्थिति या अनुपलब्धता के मामले में NaN / np.nan :

df['Amount'].fillna(value=None, method= ,axis=1,) काफी है:

दस्तावेज़ से:

मान: अदिश, तानाशाह, श्रृंखला, या डेटाफ़्रेम मानों को भरने के लिए उपयोग करने के लिए (उदाहरण 0), बारी-बारी से एक तानाशाही / श्रृंखला / मानों का मान निर्दिष्ट करना कि प्रत्येक सूचकांक के लिए किस मूल्य का उपयोग करना है (किसी श्रृंखला के लिए) या स्तंभ (डेटाफ़्रेम के लिए) । (मूल्यों में नहीं / श्रंखला / डाटाफ्रेम नहीं भरा जाएगा)। यह मान सूची नहीं हो सकता है।

जिसका अर्थ है कि 'तार' या 'स्थिरांक' अब अधिरोपित होने की अनुमति नहीं है।

अधिक विशिष्ट प्रतिरूपणों के लिए SimpleImputer () का उपयोग करें :

from sklearn.impute import SimpleImputer
si = SimpleImputer(strategy='constant', missing_values=np.nan, fill_value='Replacement_Value')
df[['Col-1', 'Col-2']] = si.fit_transform(X=df[['C-1', 'C-2']])

0

अलग-अलग कॉलम में नान को अलग-अलग तरीकों से बदलना:

   replacement= {'column_A': 0, 'column_B': -999, 'column_C': -99999}
   df.fillna(value=replacement)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.