पंडों के डेटाफ्रेम में NaN पर सेल कैसे सेट करें


97

मैं NaN द्वारा डेटाफ्रेम के एक कॉलम में खराब मानों को बदलना चाहूंगा।

mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
df = pd.DataFrame(mydata)

df[df.y == 'N/A']['y'] = np.nan

हालाँकि, अंतिम पंक्ति विफल हो जाती है और चेतावनी फेंक देती है क्योंकि यह df की प्रति पर काम कर रही है। तो, इसे संभालने का सही तरीका क्या है? मैंने iloc या ix के साथ कई समाधान देखे हैं लेकिन यहाँ, मुझे बूलियन स्थिति का उपयोग करने की आवश्यकता है।

जवाबों:


122

बस उपयोग करें replace:

In [106]:
df.replace('N/A',np.NaN)

Out[106]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN

आप जो प्रयास कर रहे हैं उसे श्रृंखला अनुक्रमण कहा जाता है: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

आप locयह सुनिश्चित करने के लिए उपयोग कर सकते हैं कि आप मूल dF पर काम करें:

In [108]:
df.loc[df['y'] == 'N/A','y'] = np.nan
df

Out[108]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN

13

उपयोग करते समय replaceसमस्या को हल करने के लिए लगता है, मैं एक विकल्प का प्रस्ताव करना चाहूंगा। स्तंभ में संख्यात्मक और कुछ स्ट्रिंग मानों के मिश्रण के साथ समस्या np.nan के साथ तार नहीं है, लेकिन पूरे स्तंभ को उचित बनाने के लिए। मुझे लगता है कि मूल कॉलम सबसे अधिक संभावना एक वस्तु प्रकार का होगा

Name: y, dtype: object

NaN द्वारा प्रतिस्थापित किए गए सभी गैर-संख्यात्मक मानों के साथ आपको वास्तव में एक संख्यात्मक कॉलम बनाने की आवश्यकता है (यह उचित प्रकार होगा और काफी तेज होगा)।

इस प्रकार, अच्छा रूपांतरण कोड होगा

pd.to_numeric(df['y'], errors='coerce')

errors='coerce'स्ट्रिंग्स को निर्दिष्ट करने के लिए निर्दिष्ट करें जो NaN बनने के लिए संख्यात्मक मान पर पार्स नहीं किया जा सकता है। कॉलम प्रकार होगा

Name: y, dtype: float64

10

आप प्रतिस्थापन का उपयोग कर सकते हैं:

df['y'] = df['y'].replace({'N/A': np.nan})

इसके लिए inplaceपैरामीटर के बारे में भी जानकारी रखें replace। आप कुछ ऐसा कर सकते हैं:

df.replace({'N/A': np.nan}, inplace=True)

यह प्रतिलिपि बनाए बिना df में सभी उदाहरणों को प्रतिस्थापित करेगा।

इसी तरह, यदि आप अन्य प्रकार के अज्ञात मानों में चलते हैं जैसे कि रिक्त स्ट्रिंग या कोई भी मान नहीं:

df['y'] = df['y'].replace({'': np.nan})

df['y'] = df['y'].replace({None: np.nan})

संदर्भ: पंडों नवीनतम - बदलें


1
df.loc[df.y == 'N/A',['y']] = np.nan

इससे आपकी समस्या का समाधान होता है। दोहरे [] के साथ, आप DataFrame की एक प्रति पर काम कर रहे हैं। आपको इसे संशोधित करने में सक्षम होने के लिए एक कॉल में सटीक स्थान निर्दिष्ट करना होगा।


0

आप इन स्निपेट्स को ट्राई कर सकते हैं।

[16] में: mydata = {'x': [10, 50, 18, 32, 47, 20], 'y': ['12', '11', 'N / A', '13', ' 15 ',' एन / ए ']}
[१F] में: df = pd.DataFrame (mydata)

[१.] में: df.y [df.y == "एन / ए"] = np.nan

आउट [19]: df 
    xy
0 10 12
१ ५० ११
२ १ Na एन.एन.
३ ३२ १३
४ १५ १५
5 20 NaN

0

पांडा 1.0.0 के रूप में, अब आपको अपने डेटाफ़्रेम में शून्य मान बनाने के लिए संख्यात्मक उपयोग करने की आवश्यकता नहीं है। इसके बजाय आप बस pandas.NA का उपयोग कर सकते हैं (जो कि प्रकार pandas._libs.missing.NAType है), इसलिए इसे डेटाफ़्रेम के भीतर अशक्त माना जाएगा, लेकिन डेटाफ़्रेम संदर्भ के बाहर रिक्त नहीं होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.