पांडा डेटाफ़्रेम: नैनो मानों को कॉलम के औसत से बदलें


177

मुझे एक पांडा मिला है DataFrame ज्यादातर वास्तविक संख्याओं से भरा है, लेकिन इसमें कुछ nanमूल्य भी हैं।

मैं उन nanस्तंभों के औसत के साथ एस को कैसे बदल सकता हूं जहां वे हैं?

यह प्रश्न इस तरह से बहुत समान है: संख्यात्मक सरणी: स्तंभों के औसत के साथ नैन मूल्यों को बदलें लेकिन, दुर्भाग्य से, वहां दिए गए समाधान एक पांडा डेटाफ़्रेम के लिए काम नहीं करते हैं।

जवाबों:


273

आप बस सीधे DataFrame.fillnaभरने के लिए उपयोग कर सकते nanहैं:

In [27]: df 
Out[27]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3       NaN -2.027325  1.533582
4       NaN       NaN  0.461821
5 -0.788073       NaN       NaN
6 -0.916080 -0.612343       NaN
7 -0.887858  1.033826       NaN
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

In [28]: df.mean()
Out[28]: 
A   -0.151121
B   -0.231291
C   -0.530307
dtype: float64

In [29]: df.fillna(df.mean())
Out[29]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3 -0.151121 -2.027325  1.533582
4 -0.151121 -0.231291  0.461821
5 -0.788073 -0.231291 -0.530307
6 -0.916080 -0.612343 -0.530307
7 -0.887858  1.033826 -0.530307
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

डॉक्सस्ट्रिंग का fillnaकहना है कि valueएक स्केलर या एक तानाशाह होना चाहिए, हालांकि, यह एक Seriesअच्छी तरह से काम करता है। यदि आप एक तानाशाही पारित करना चाहते हैं, तो आप उपयोग कर सकते हैं df.mean().to_dict()


10
df.fillna(df.mean())नया डेटाफ़्रेम वापस करेगा, इसलिए आपको df=df.fillna(df.mean())इसे रखने के लिए लिखना होगा।
यानिस

किसी भी विचार क्यों मैं इस का उपयोग कर मतलब के लिए गलत राशि प्राप्त हो रही हो सकता है?
bernando_vialli

25
इसके बजाय df=df.fillna(df.mean())आप भी इस्तेमाल कर सकते हैंdf.fillna(df.mean(), inplace=True)
एंडरसन पिमेंटेल

19
चेतावनी: यदि आप मशीन लर्निंग / डेटा साइंस के लिए इसका उपयोग करना चाहते हैं: डेटा साइंस के नजरिए से, तो पहले NA को बदलना और फिर ट्रेन और टेस्ट में विभाजित होना गलत है ... आप पहले ट्रेन और टेस्ट में विभाजित हो जाएं, फिर NA से प्रतिस्थापित करें ट्रेन पर मतलब है और फिर परीक्षण करने के लिए इस राज्य के प्रीप्रोसेसिंग मॉडल को लागू करें, नीचे दिए गए sklearn से संबंधित उत्तर देखें!
फेबियन वर्नर

1
@ amalik2205 क्योंकि अन्यथा आप प्रशिक्षण सेट में परीक्षण सेट से जानकारी लीक कर रहे हैं! इसे इस तरह से कल्पना करें: हमारे पास 100 डेटा पंक्तियाँ हैं और हम स्तंभ x पर विचार करते हैं। X की पहली 99 प्रविष्टियाँ NA हैं। हम एक परीक्षण सेट के रूप में 100 पंक्ति को विभाजित करना चाहते हैं। मान लें कि पंक्ति 100 में स्तंभ x में मान 20 है। फिर आप स्तंभ x में दिए गए प्रशिक्षण में सभी प्रविष्टियों को 20 के साथ बदल देंगे, परीक्षण सेट से 100% मूल्य प्राप्त होगा। इसलिए, मूल्यांकन आपको मूर्ख बना सकता है!
फेबियन वर्नर


27
In [16]: df = DataFrame(np.random.randn(10,3))

In [17]: df.iloc[3:5,0] = np.nan

In [18]: df.iloc[4:6,1] = np.nan

In [19]: df.iloc[5:8,2] = np.nan

In [20]: df
Out[20]: 
          0         1         2
0  1.148272  0.227366 -2.368136
1 -0.820823  1.071471 -0.784713
2  0.157913  0.602857  0.665034
3       NaN -0.985188 -0.324136
4       NaN       NaN  0.238512
5  0.769657       NaN       NaN
6  0.141951  0.326064       NaN
7 -1.694475 -0.523440       NaN
8  0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794

In [22]: df.mean()
Out[22]: 
0   -0.251534
1   -0.040622
2   -0.841219
dtype: float64

उस कॉलम का माध्य प्रति-कॉलम लागू करें और भरें

In [23]: df.apply(lambda x: x.fillna(x.mean()),axis=0)
Out[23]: 
          0         1         2
0  1.148272  0.227366 -2.368136
1 -0.820823  1.071471 -0.784713
2  0.157913  0.602857  0.665034
3 -0.251534 -0.985188 -0.324136
4 -0.251534 -0.040622  0.238512
5  0.769657 -0.040622 -0.841219
6  0.141951  0.326064 -0.841219
7 -1.694475 -0.523440 -0.841219
8  0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794

4
मुझे नहीं पता कि क्यों, लेकिन df.fillna (df.mean ()) ने काम नहीं किया, केवल आपका संस्करण लागू होता है। Python 3
Rocketq

12
# To read data from csv file
Dataset = pd.read_csv('Data.csv')

X = Dataset.iloc[:, :-1].values

# To calculate mean use imputer class
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputer = imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3])

दूर के सरल विकल्पों में इस सब का क्या फायदा है?
एएमसी

@ रोशन झा तर्क की व्याख्या करना हमेशा बेहतर होता है। R & Python में समान कार्य करने के कई तरीके हैं। हालाँकि, यदि आप कुछ अलग करने का सुझाव दे रहे हैं, तो आप ऐसा करने की कुछ सलाह देना चाहते हैं
डॉ। निशा अरोड़ा

10

यदि आप माध्य के साथ लापता मानों को लागू करना चाहते हैं और आप स्तंभ द्वारा स्तंभ पर जाना चाहते हैं, तो यह केवल उस स्तंभ के माध्य के साथ लागू होगा। यह थोड़ा अधिक पठनीय हो सकता है।

sub2['income'] = sub2['income'].fillna((sub2['income'].mean()))

3
कृपया इस समस्या को हल करने के बारे में कुछ जानकारी दें।
गुरविंदर सिंह

10

df.fillna(df.mean())माध्य के साथ सभी शून्य मान को भरने के लिए सीधे उपयोग करें

यदि आप उस कॉलम के माध्य से शून्य मान भरना चाहते हैं तो आप इसका उपयोग कर सकते हैं

लगता है x=df['Item_Weight']यहाँ Item_Weightस्तंभ नाम है

यहाँ हम असाइन कर रहे हैं (x के x के साथ x के मान को शून्य मान भरें)

df['Item_Weight'] = df['Item_Weight'].fillna((df['Item_Weight'].mean()))

यदि आप कुछ स्ट्रिंग के साथ शून्य मान भरना चाहते हैं तो उपयोग करें

यहां Outlet_sizeकॉलम नाम है

df.Outlet_Size = df.Outlet_Size.fillna('Missing')

9

इसके अलावा एक अन्य विकल्प ऊपर है:

df = df.groupby(df.columns, axis = 1).transform(lambda x: x.fillna(x.mean()))

यह मीन के लिए पिछली प्रतिक्रियाओं की तुलना में कम सुरुचिपूर्ण है, लेकिन यदि आप किसी अन्य स्तंभ फ़ंक्शन द्वारा नल को बदलने की इच्छा रखते हैं तो यह कम हो सकता है।


7

पंडों: NaN ( nan) मानों को औसत (माध्य), माध्यिका या एक कॉलम के अन्य आंकड़ों के साथ कैसे बदलें

मान लें कि आपका डेटाफ़्रेम है dfऔर आपके पास एक कॉलम है nr_items। ये है: df['nr_items']

आप चाहते हैं की जगहNaN अपने कॉलम के मूल्यों df['nr_items']के साथ स्तंभ के मतलब :

उपयोग विधि .fillna():

mean_value=df['nr_items'].mean()
df['nr_item_ave']=df['nr_items'].fillna(mean_value)

मैंने स्तंभ के मान द्वारा प्रतिस्थापित मूल्यों के साथ नए कॉलम को संग्रहीत करने के लिए एक नया dfकॉलम बनाया है ।nr_item_aveNaNmean

का उपयोग करते समय आपको सावधान रहना चाहिए mean। यदि आपके पास आउटलेयर है, तो इसका उपयोग करने के लिए अधिक अनुशंसा योग्य हैmedian


0

स्केलेर लाइब्रेरी प्रीप्रोसेसिंग क्लास का उपयोग करना

from sklearn.impute import SimpleImputer
missingvalues = SimpleImputer(missing_values = np.nan, strategy = 'mean', axis = 0)
missingvalues = missingvalues.fit(x[:,1:3])
x[:,1:3] = missingvalues.transform(x[:,1:3])

ध्यान दें: हाल के संस्करण पैरामीटर में missing_valuesकरने के लिए मूल्य परिवर्तन np.nanसेNaN

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