पंडों: श्रेणियों को संख्याओं में परिवर्तित करें


86

मान लीजिए कि मेरा उन देशों के साथ डेटाफ़्रेम है जो इस प्रकार है:

cc | temp
US | 37.0
CA | 12.0
US | 35.0
AU | 20.0

मुझे पता है कि देशों को 'वन-हॉट एन्कोडिंग' में बदलने के लिए एक pd.get_dummies फ़ंक्शन है। हालांकि, मैं उन्हें इसके बजाय सूचकांकों में परिवर्तित करना चाहता हूं ताकि मुझे cc_index = [1,2,1,3]इसके बजाय मिल जाएगा।

मैं मान रहा हूं कि एक सुन्न के साथ get_dummies का उपयोग करने की तुलना में एक तेज़ तरीका है जहां क्लॉज को नीचे दिखाया गया है:

[np.where(x) for x in df.cc.get_dummies().values]

यह 'कारकों' का उपयोग करते हुए आर में करना कुछ आसान है, इसलिए मुझे उम्मीद है कि पांडा कुछ इसी तरह का होगा।


2
क्या आपका मतलब है cc_index = [0,1,0,2]?
juanpa.arrivillaga

1
यकीन है, अजगर 0 इंडेक्स के बारे में भूल गया
sachinruk

डेटाफ़्रेम में श्रेणीबद्ध श्रृंखला या कॉलम मदद कर सकते हैं।
min2bro

जवाबों:


150

सबसे पहले, कॉलम का प्रकार बदलें:

df.cc = pd.Categorical(df.cc)

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

df['code'] = df.cc.cat.codes

अब आपके पास है:

   cc  temp  code
0  US  37.0     2
1  CA  12.0     1
2  US  35.0     2
3  AU  20.0     0

यदि आप अपना DataFrame संशोधित नहीं करना चाहते हैं, लेकिन बस कोड प्राप्त करते हैं:

df.cc.astype('category').cat.codes

या एक सूचकांक के रूप में श्रेणीबद्ध कॉलम का उपयोग करें:

df2 = pd.DataFrame(df.temp)
df2.index = pd.CategoricalIndex(df.cc)

5
df.cc.cat.codesलगता है कि कॉल सिर्फ बदल गया है df.cc.codes?
एंड्रियास स्टॉरविक स्ट्रोमैन

1
ध्यान दें कि यदि आपके पास लापता मान हैं, तो उन्हें -1 में एन्कोड किया जाएगा। यदि आप इस मामले के इलाज से बचना चाहते हैं तो आप पहले स्ट्रिंग कर सकते हैं: df.cc.astype ('str')। astype ('श्रेणी')। cat.codes
Guy s

यह NaNरूप में परिवर्तन लगता है -1?
शाम

25

यदि आप केवल अपनी श्रृंखला को पूर्णांक पहचानकर्ताओं में बदलना चाहते हैं, तो आप उपयोग कर सकते हैं pd.factorize

इस समाधान पर ध्यान दें, इसके विपरीत pd.Categorical, वर्णानुक्रम में सॉर्ट नहीं होगा। इसलिए पहले देश को सौंपा जाएगा 0। यदि आप से शुरू करना चाहते हैं 1, तो आप एक स्थिरांक जोड़ सकते हैं:

df['code'] = pd.factorize(df['cc'])[0] + 1

print(df)

   cc  temp  code
0  US  37.0     1
1  CA  12.0     2
2  US  35.0     1
3  AU  20.0     3

यदि आप वर्णानुक्रम में क्रमबद्ध करना चाहते हैं, तो निर्दिष्ट करें sort=True:

df['code'] = pd.factorize(df['cc'], sort=True)[0] + 1 

14

यदि आप sklearnपुस्तकालय का उपयोग कर रहे हैं तो आप उपयोग कर सकते हैं LabelEncoder। जैसे pd.Categorical, इनपुट स्ट्रिंग्स को एन्कोडिंग से पहले वर्णानुक्रम में क्रमबद्ध किया जाता है।

from sklearn.preprocessing import LabelEncoder

LE = LabelEncoder()
df['code'] = LE.fit_transform(df['cc'])

print(df)

   cc  temp  code
0  US  37.0     2
1  CA  12.0     1
2  US  35.0     2
3  AU  20.0     0

2

इसे आज़माएं, आवृत्ति के आधार पर संख्या में परिवर्तित करें (उच्च आवृत्ति - उच्च संख्या):

labels = df[col].value_counts(ascending=True).index.tolist()
codes = range(1,len(labels)+1)
df[col].replace(labels,codes,inplace=True)

1

किसी भी कॉलम को नंबरों में बदल देंगे। यह एक नया कॉलम नहीं बनाएगा, लेकिन केवल संख्यात्मक डेटा के साथ मानों को बदल देगा।

def characters_to_numb(*args): for arg in args: df[arg] = pd.Categorical(df[arg]) df[arg] = df[arg].cat.codes return df


0

एक-पंक्ति कोड:

df[['cc']] = df[['cc']].apply(lambda col:pd.Categorical(col).codes)

अगर आपके पास यह काम करता है list_of_columns:

df[list_of_columns] = df[list_of_columns].apply(lambda col:pd.Categorical(col).codes)

इसके अलावा, यदि आप अपने NaNमूल्यों को रखना चाहते हैं, तो आप एक प्रतिस्थापन लागू कर सकते हैं:

df[['cc']] = df[['cc']].apply(lambda col:pd.Categorical(col).codes).replace(-1,np.nan)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.