पंडों डेटाफ्रेम फिलना () केवल कुछ कॉलमों के स्थान पर


145

मैं पंडों के डेटाफ्रेम में 0 के साथ कॉलम के केवल कुछ सबसेट के लिए कोई भी मान भरने की कोशिश नहीं कर रहा हूं।

जब मैं करता हूं:

import pandas as pd
df = pd.DataFrame(data={'a':[1,2,3,None],'b':[4,5,None,6],'c':[None,None,7,8]})
print df
df.fillna(value=0, inplace=True)
print df

उत्पादन:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  NaN  7.0
3  NaN  6.0  8.0
     a    b    c
0  1.0  4.0  0.0
1  2.0  5.0  0.0
2  3.0  0.0  7.0
3  0.0  6.0  8.0

यह हर जगह के Noneसाथ है 0। मुझे क्या करना चाहते है, केवल की जगह Noneस्तंभों में रों aऔर bनहीं, बल्कि c

ऐसा करने का सबसे अच्छा तरीका क्या है?

जवाबों:


219

आप अपने इच्छित कॉलम का चयन कर सकते हैं और इसे असाइनमेंट द्वारा कर सकते हैं:

df[['a', 'b']] = df[['a','b']].fillna(value=0)

परिणामी आउटपुट अपेक्षित है:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

हां, यह वही है जो मैं चाहता हूं! धन्यवाद। यह करने के लिए कोई भी तरीका? मेरा मूल डेटाफ़्रेम बहुत बड़ा है।
सैट

1
मुझे नहीं लगता कि ऐसा करने से कोई प्रदर्शन लाभ होगा क्योंकि आप वैसे भी मूल df को ओवरराइट कर रहे हैं
EdChum

4
नियंत्रण रेखा यहाँ है, df[['a', 'b']] = df[['a','b']].fillna(value=0)अभी भी काम करेगा
एडचम

2
@EdChum क्या यह एक अस्थायी डेटा फ़्रेम का उत्पादन नहीं करता है और इसलिए ऐसा करने के लिए अधिक मेमोरी की आवश्यकता है? (मैं समय की जटिलता से अधिक स्मृति के बारे में चिंतित हूं।)
सैट

7
कई ऑपरेशनों के लिए, inplaceअभी भी एक कॉपी पर काम करेंगे। मुझे नहीं पता कि यह मामला है fillnaया नहीं। पांडा कोर डेवलपर्स में से एक से यह जवाब देखें ।
रूट

85

आप निम्न का उपयोग कर सकते हैं dict, fillnaअलग कॉलम के लिए अलग मूल्य के साथ

df.fillna({'a':0,'b':0})
Out[829]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

इसे वापस करने के बाद

df=df.fillna({'a':0,'b':0})
df
Out[831]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

1
वास्तव में अच्छा है, fromkeysयदि आप चाहते हैं कि आप उपयोग कर सकते हैं, तो Btw , +1
U10- फॉरवर्ड

1
यदि यह वास्तव में विभिन्न स्तंभों के लिए अलग-अलग मान दिखाता है, तो इसका उत्तर / उदाहरण स्पष्ट होगा।
RufusVS

@RufusVS जो सही है, लेकिन फिर भी ऑप के अपेक्षित आउटपुट से मेल खाने की कोशिश करता है
YOBEN_S

1
यह बेहतर समाधान है जो स्वीकृत उत्तर है, क्योंकि यह जंजीर अनुक्रमित मुद्दों से बचा जाता है, उदाहरण के लिए यदि उपयोग किया जाता हैdf.fillna({'a':0,'b':0}, inplace=True)
एलेक्स

19

आप वेन के घोल का उपयोग करके ऑब्जेक्ट की एक कॉपी बनाने से बच सकते हैं और inplace = True:

df.fillna({'a':0, 'b':0}, inplace=True)
print(df)

कौन सी पैदावार:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

1
हालांकि यह सही है, नकल से बचना जरूरी नहीं है
जेपी

7

यहां बताया गया है कि आप इसे एक पंक्ति में कैसे कर सकते हैं:

df[['a', 'b']].fillna(value=0, inplace=True)

ब्रेकडाउन: df[['a', 'b']]उन स्तंभों का चयन करता है value=0जिनके लिए आप NaN मान भरना चाहते हैं, इसे NaNs को शून्य से भरने के लिए कहता है, और inplace=Trueऑब्जेक्ट की प्रतिलिपि बनाए बिना परिवर्तनों को स्थायी बना देगा।


7

शीर्ष उत्तर का उपयोग करने से df स्लाइस की कॉपी में परिवर्तन करने के बारे में चेतावनी मिलती है। यह मानते हुए कि आपके पास अन्य कॉलम हैं, ऐसा करने का एक बेहतर तरीका एक शब्दकोश पास करना है:
df.fillna({'A': 'NA', 'B': 'NA'}, inplace=True)


3

या ऐसा कुछ:

df.loc[df['a'].isnull(),'a']=0
df.loc[df['b'].isnull(),'b']=0

और अगर वहाँ अधिक है:

for i in your_list:
    df.loc[df[i].isnull(),i]=0

0

कभी-कभी यह वाक्य रचना काम नहीं करेगी:

df[['col1','col2']] = df[['col1','col2']].fillna()

इसके बजाय निम्नलिखित का उपयोग करें:

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