2016-01-21 6 views
13

में जगह में कई स्तंभों में भरना मेरे पास एक पांडा डेटा है मिश्रित प्रकारों का फ्रेम, कुछ तार हैं और कुछ संख्याएं हैं। मैं द्वारा स्ट्रिंग स्तंभों में नेन मूल्यों को बदलने के लिए चाहते हैं, और नेन द्वारा 0.पाइथन पांडस

नाव स्तंभ में मान इस छोटे से काल्पनिक उदाहरण पर विचार करें '।':

df = pd.DataFrame({'Name':['Jack','Sue',pd.np.nan,'Bob','Alice','John'], 
    'A': [1, 2.1, pd.np.nan, 4.7, 5.6, 6.8], 
    'B': [.25, pd.np.nan, pd.np.nan, 4, 12.2, 14.4], 
    'City':['Seattle','SF','LA','OC',pd.np.nan,pd.np.nan]}) 

अब, मैं में यह कर सकते हैं 3 लाइनों:

df['Name'].fillna('.',inplace=True) 
df['City'].fillna('.',inplace=True) 
df.fillna(0,inplace=True) 

चूंकि यह एक छोटा सा dataframe है, 3 लाइनों शायद ठीक है। मेरे असली उदाहरण में (जो मैं डेटा गोपनीयता कारणों के कारण यहां साझा नहीं कर सकता), मेरे पास कई और स्ट्रिंग कॉलम और संख्यात्मक कॉलम हैं। इसलिए मैं सिर्फ भरने के लिए कई लाइनें लिखता हूं। क्या ऐसा करने का एक संक्षिप्त तरीका है?

+0

आपके वास्तविक उदाहरण में, स्ट्रिंग कॉलम के लिए 'NaN' या स्ट्रिंग' NaN'' है? – EdChum

+0

NaN, स्ट्रिंग 'NaN' नहीं – ozzy

उत्तर

10

आप dtype जाँच चाहे वह numeric या नहीं है dtype.kind की जाँच करके साथ अपने कॉलम के लिए apply इस्तेमाल कर सकते हैं के रूप में ही है:

res = df.apply(lambda x: x.fillna(0) if x.dtype.kind in 'biufc' else x.fillna('.')) 

print(res) 
    A  B  City Name 
0 1.0 0.25 Seattle Jack 
1 2.1 0.00  SF Sue 
2 0.0 0.00  LA  . 
3 4.7 4.00  OC Bob 
4 5.6 12.20  . Alice 
5 6.8 14.40  . John 
+0

यह बहुत छोटा है और यह काम करता है! धन्यवाद – ozzy

5

आप या तो स्ट्रिंग कॉलम को हाथ से सूचीबद्ध कर सकते हैं या उन्हें df.dtypes से प्राप्त कर सकते हैं। एक बार आपके पास स्ट्रिंग/ऑब्जेक्ट कॉलम की सूची हो जाने के बाद, आप एक ही समय में उन सभी कॉलम पर fillna पर कॉल कर सकते हैं।

def myfillna(series): 
    if series.dtype is pd.np.dtype(float): 
     return series.fillna(0) 
    elif series.dtype is pd.np.dtype(object): 
     return series.fillna('.') 
    else: 
     return series 

आप यदि आप किसी अन्य तरीके से एक अलग dtype के एक स्तंभ भरना चाहते हैं अन्य elif बयान जोड़ सकते हैं:

# str_cols = ['Name','City'] 
str_cols = df.columns[df.dtypes==object] 
df[str_cols] = df[str_cols].fillna('.') 
df.fillna(0,inplace=True) 
+0

यह काम करता है! धन्यवाद! – ozzy

1

एक समारोह को परिभाषित। अब dataframe के सभी स्तंभों पर इस समारोह लागू

df = df.apply(myfillna) 

इस 'inplace'

+0

यह एक समारोह के रूप में लिखने के लिए समझ में आता है। लेकिन क्या हमें इसे df.columns में col के लिए लिखने की आवश्यकता नहीं होगी: डीएफ [col] = df.apply (myfillna) '? फ़ंक्शन एक श्रृंखला लौटा रहा है, और हम इसके साथ पूरे डेटा फ्रेम को प्रतिस्थापित करते हैं। – ozzy

+0

नहीं क्योंकि डिफ़ॉल्ट रूप से लागू पैरामीटर अक्ष = 0 है जिसका अर्थ है प्रत्येक कॉलम पर फ़ंक्शन लागू करना और फिर परिणाम को नए कॉलम के साथ डेटाफ्रेम के रूप में देता है। – latorrefabian

+0

तो वास्तव में df.apply (myfillna) दृश्यों के पीछे जो सुझाव देता है वह कर रहा है। – latorrefabian