पंडों में कॉलम मानों को बदलना DataFrame


141

मैं डेटाफ़्रेम के एक कॉलम में मानों को बदलने का प्रयास कर रहा हूं। स्तंभ ('महिला') में केवल 'महिला' और 'पुरुष' मूल्य शामिल हैं।

मैंने निम्नलिखित कोशिश की है:

w['female']['female']='1'
w['female']['male']='0' 

लेकिन पिछले परिणामों की सटीक समान प्रति प्राप्त करें।

मैं आदर्श रूप से कुछ आउटपुट प्राप्त करना चाहूंगा जो निम्नलिखित लूप तत्व-वार जैसा दिखता है।

if w['female'] =='female':
    w['female'] = '1';
else:
    w['female'] = '0';

मैंने गॉटच डॉक्यूमेंटेशन के माध्यम से देखा है ( http://pandas.pydata.org/pandas-docs/stable/gotchas.html ) लेकिन यह पता नहीं लगा सकता कि कुछ भी क्यों नहीं होता।

किसी भी तरह की सहायता को आभार समझेंगे।

जवाबों:


259

अगर मैं सही समझूं, तो आप कुछ इस तरह चाहते हैं:

w['female'] = w['female'].map({'female': 1, 'male': 0})

(यहां मैं संख्याओं के बजाय मूल्यों को संख्याओं में परिवर्तित करता हूं। यदि आप वास्तव में चाहते हैं, तो आप उन्हें बदल सकते हैं "1"और "0", लेकिन मुझे यकीन नहीं है कि आप ऐसा क्यों चाहते हैं।)

आपके कोड के काम न करने का कारण यह है कि ['female']एक कॉलम ( 'female'आपके दूसरे में w['female']['female']) का उपयोग करने का मतलब यह नहीं है कि "उन पंक्तियों का चयन करें जहां मान 'महिला' है।" इसका मतलब उन पंक्तियों का चयन करना है जहाँ सूचकांक 'महिला' है, जिनमें से आपके DataFrame में कोई भी नहीं हो सकता है।


6
धन्यवाद। ठीक वही जो मेरे द्वारा खोजा जा रहा था। अगर मैं 'मादा' को 1 और कुछ और को '0' में मैप करता। वह कैसे काम करेगा?
ब्लैक

17
इसका उपयोग केवल तभी करें, यदि स्तंभ में सभी मान मानचित्र फ़ंक्शन में दिए गए हैं। मानचित्र फ़ंक्शन में निर्दिष्ट नहीं किए गए कॉलम मान को नैनो द्वारा प्रतिस्थापित किया जाएगा।
चंद्रा

1
मैं भी .locबचने के लिए वाक्यविन्यास का उपयोग करने की सलाह दूंगाSettingWithCopyWarning : pandas.pydata.org/pandas-docs/stable/…
NickBraunagel

2
इसके बजाय मैंने .replace का उपयोग किया
JS noob

मैं कैसे छुटकारा पाऊँ '।' दो या दो से अधिक स्तंभों पर हजारों, समझ नहीं सकते। बहुत बहुत धन्यवाद
एम। Mariscal

115

आप loc का उपयोग करके किसी डेटाफ़्रेम के सबसेट को संपादित कर सकते हैं:

df.loc[<row selection>, <column selection>]

इस मामले में:

w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1

1
मैं इसे कैसे अनुकूलित करूंगा, इसलिए मुझे किसी शर्त के माध्यम से विशिष्ट पंक्तियों का चयन करने की आवश्यकता नहीं है, बस एक विशेष कॉलम में सभी पंक्तियों को? इसलिए एक कॉलम में सभी सेल को एक विशेष मान में बदलें।
ध्रुव गुलाटी

3
@ ध्रुवगुलती, आप df.loc का उपयोग करेंगे [:, <कॉलम चयन>]




11

आप भी अर्थात् के applyसाथ उपयोग कर सकते हैं.get

w['female'] = w['female'].apply({'male':0, 'female':1}.get):

w = pd.DataFrame({'female':['female','male','female']})
print(w)

डेटाफ्रेम w:

   female
0  female
1    male
2  female

applyशब्दकोश से मूल्यों को बदलने के लिए उपयोग करना :

w['female'] = w['female'].apply({'male':0, 'female':1}.get)
print(w)

परिणाम:

   female
0       1
1       0
2       1 

नोट: apply शब्दकोश के साथ प्रयोग किया जाना चाहिए यदि डेटाफ्रेम में स्तंभों के सभी संभावित मूल्यों को शब्दकोश में परिभाषित किया गया है, तो यह उन लोगों के लिए खाली होगा, जो शब्दकोश में परिभाषित नहीं हैं।


8

यह बहुत कॉम्पैक्ट है:

w['female'][w['female'] == 'female']=1
w['female'][w['female'] == 'male']=0

एक और अच्छा एक:

w['female'] = w['female'].replace(regex='female', value=1)
w['female'] = w['female'].replace(regex='male', value=0)

पहला उदाहरण अनुक्रमित जंजीर है और इसके खिलाफ चेतावनी दी जाती है क्योंकि यह गारंटी नहीं दे सकता है कि परिणामी df एक प्रति है या एक दृश्य है। जंजीर-अनुक्रमण
नॉर्डल जूल

7

वैकल्पिक रूप से इन प्रकार के असाइनमेंट के लिए अंतर्निहित फ़ंक्शन pd.get_dummies है:

w['female'] = pd.get_dummies(w['female'],drop_first = True)

यह आपको दो स्तंभों के साथ एक डेटा फ्रेम देता है, प्रत्येक मूल्य के लिए एक है जो w ['महिला'] में होता है, जिनमें से आप पहले छोड़ देते हैं (क्योंकि आप इसे छोड़ दिए गए व्यक्ति से अनुमान लगा सकते हैं)। नए स्तंभ को स्वचालित रूप से उस स्ट्रिंग का नाम दिया गया है जिसे आपने प्रतिस्थापित किया है।

यह विशेष रूप से उपयोगी है यदि आपके पास दो से अधिक संभावित मानों के साथ श्रेणीबद्ध चर हैं। यह फ़ंक्शन सभी मामलों के बीच अंतर करने के लिए आवश्यक कई डमी चर बनाता है। तब सावधान रहें कि आप पूरे डेटा फ्रेम को एक कॉलम में निर्दिष्ट नहीं करते हैं, लेकिन इसके बजाय, यदि w ['महिला'] 'पुरुष', 'महिला' या 'तटस्थ' हो सकता है, तो ऐसा कुछ करें:

w = pd.concat([w, pd.get_dummies(w['female'], drop_first = True)], axis = 1])
w.drop('female', axis = 1, inplace = True)

फिर आपको दो नए कॉलम दिए जाते हैं, जो आपको 'महिला' की डमी कोडिंग देते हैं और आपको स्ट्रींग के साथ कॉलम से छुटकारा मिल जाता है।


4

के Series.mapसाथ उपयोग कर रहा हैSeries.fillna

अपने कॉलम केवल अधिक से अधिक तार मौजूद होता है तो femaleऔर male, Series.mapइस मामले में असफल के बाद से यह वापस आ जाएगी जाएगा NaNअन्य मूल्यों के लिए।

इसलिए हमें इसे श्रृंखलाबद्ध करना होगा fillna:

उदाहरण क्यों .mapविफल रहता है :

df = pd.DataFrame({'female':['male', 'female', 'female', 'male', 'other', 'other']})

   female
0    male
1  female
2  female
3    male
4   other
5   other
df['female'].map({'female': '1', 'male': '0'})

0      0
1      1
2      1
3      0
4    NaN
5    NaN
Name: female, dtype: object

के लिए सही विधि है, हम श्रृंखला mapके साथ fillnaहै, तो हम को भरने के NaNमूल कॉलम के मानों के साथ:

df['female'].map({'female': '1', 'male': '0'}).fillna(df['female'])

0        0
1        1
2        1
3        0
4    other
5    other
Name: female, dtype: object

2

pandasनामक एक फ़ंक्शन भी हैfactorize जो आप स्वचालित रूप से काम के इस प्रकार करने के लिए उपयोग कर सकते हैं। यह लेबल को संख्याओं में परिवर्तित करता है ['male', 'female', 'male'] -> [0, 1, 0]:। अधिक जानकारी के लिए यह उत्तर देखें ।


0

मुझे लगता है कि उत्तर में इंगित किया जाना चाहिए कि आपको किस प्रकार का ऑब्जेक्ट ऊपर दिए गए सभी तरीकों से मिलता है: क्या यह श्रृंखला या डेटाफ़्रेम है।

जब आपको कॉलम मिलता है w.female.या w[[2]](जहां, मान लीजिए, आपके कॉलम की संख्या 2 है) तो आपको डेटाफ़्रेम वापस मिल जाएगा। तो इस मामले में आप जैसे DataFrame मेथड का उपयोग कर सकते हैं.replace

जब आप उपयोग करते हैं .locया ilocआप वापस श्रृंखला प्राप्त करते हैं, और श्रृंखला में .replaceविधि नहीं होती है, तो आपको तरीकों का उपयोग करना चाहिए apply, mapऔर इसी तरह।

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