2012-11-08 10 views
181

मैंकैसे मैं एक पांडा dataframe के एक कॉलम में शून्य के साथ सभी NaN मूल्यों की जगह ले सकता

 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 

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

ValueError: cannot convert float NaN to integer 

मैं एक समारोह गणित मॉड्यूल से .isnan का उपयोग कर लागू करने की कोशिश की है मैं पांडा .replace विशेषता मैं पांडा से .sparse डेटा विशेषता 0.9 मैं भी अगर NaN == NaN की कोशिश की है की कोशिश की कोशिश की है एक समारोह में बयान। मैंने कुछ अन्य लेखों को देखते हुए इस आलेख को How do I replace NA values with zeros in an R dataframe? पर भी देखा है। मैंने कोशिश की सभी विधियों ने काम नहीं किया है या नाएन को नहीं पहचानते हैं। किसी भी संकेत या समाधान की सराहना की जाएगी।

+1

हमें इसी कोड-पार्ट्स pls दिखाएं, क्योंकि मेरी क्रिस्टल-बॉल एटीएम टूट गई है। श्रीमान ... और यदि अमन की पोस्ट चाल में नहीं है तो आपके ट्रेसबैक भी शामिल हैं। ;-) –

उत्तर

328

मेरा मानना ​​है कि DataFrame.fillna() आपके लिए यह करेगा।

a dataframe और a Series के लिए डॉक्स से लिंक करें।

उदाहरण:

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 

, केवल एक स्तंभ में Nans भरने सिर्फ इतना है कि स्तंभ का चयन करें। इस मामले में मैं वास्तव में डीएफ की सामग्री को बदलने के लिए inplace = True का उपयोग कर रहा हूं।

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 
+0

क्या यह गारंटी है कि मूल डीएफ की प्रतिलिपि के बजाय 'डीएफ [1] 'एक दृश्य है? जाहिर है, अगर एक दुर्लभ स्थिति है जहां यह एक प्रति है, तो यह एक सुपर-परेशानी बग का कारण बनता है। क्या पांडा दस्तावेज में उस पर कोई स्पष्ट बयान है? – max

+0

@max इसे देखें, आपके प्रश्न का समाधान हो सकता है: http://stackoverflow.com/questions/23296282/what-rules-does-pandas-use-to-generate-a-view-vs-a-copy – Aman

+0

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

16

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

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

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

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

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

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

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

12

नीचे दिया गया कोड मेरे लिए काम करता है।

import pandas 

df = pandas.read_csv('somefile.txt') 

df = df.fillna(0) 
33

यह गारंटी नहीं है कि टुकड़ा एक दृश्य या प्रतिलिपि देता है।आप

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

बस "इनस्थल = ट्रू" समस्या की खोज की। यह उत्तर इस मुद्दे से बचाता है और मुझे लगता है कि सबसे साफ समाधान प्रस्तुत किया गया है। – TimCera

9

आप replace इस्तेमाल कर सकते हैं NaN0 को बदलने के लिए कर सकते हैं:

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) 
2

fillna() यह करने के लिए सबसे अच्छा तरीका है। कोड -

#fill all Nan value with zero 
df = df.fillna(0) 

तुम भी inplace का उपयोग आप उपयोग करना 'DF = df.fillna (मान)' नहीं चाहते हैं तो कर सकते हैं। कोड -

df.fillna(0, inplace=True) 
2

आप fillna() उपयोग करना चाहिए। इससे मेरा काम बनता है।

df = df.fillna(value_to_replace_null) 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^