पंडों में बड़े पैमाने पर श्रेणीबद्ध कॉलम बदलें (एक-गर्म एन्कोडिंग नहीं)


12

मेरे पास पंडों की डेटाफ्रेम टन के साथ श्रेणीबद्ध कॉलम हैं, जो मैं स्किकिट-लर्न के साथ निर्णय पेड़ में उपयोग करने की योजना बना रहा हूं। मुझे उन्हें संख्यात्मक मूल्यों (एक गर्म वैक्टर नहीं) में बदलने की आवश्यकता है। मैं इसे scikit से LabelEncoder से सीख सकता हूं। समस्या यह है कि उनमें से बहुत सारे हैं, और मैं उन्हें मैन्युअल रूप से परिवर्तित नहीं करना चाहता।

इस प्रक्रिया को स्वचालित करने का एक आसान तरीका क्या होगा।


पांडा में get_dummies फ़ंक्शन आपकी सहायता कर सकता है। अधिक विवरण के लिए यहां दस्तावेज की जांच करें । मुझे लगता है कि यह पूरी तरह से इस उपयोग के मामले को कवर करता है और आप कस्टम उपसर्गों की आपूर्ति करके व्यवहार को आगे बढ़ा सकते हैं।
hssay

जवाबों:


11

यदि आपके श्रेणीबद्ध कॉलम वर्तमान में वर्ण / वस्तु हैं, तो आप प्रत्येक का उपयोग करने के लिए कुछ इस तरह का उपयोग कर सकते हैं:

char_cols = df.dtypes.pipe(lambda x: x[x == 'object']).index

for c in char_cols:
    df[c] = pd.factorize(df[c])[0]

यदि आपको उन श्रेणियों पर वापस जाने में सक्षम होने की आवश्यकता है जो मैं एन्कोडिंग को बचाने के लिए एक शब्दकोश बनाऊंगा; कुछ इस तरह:

char_cols = df.dtypes.pipe(lambda x: x[x == 'object']).index
label_mapping = {}

for c in char_cols:
    df[c], label_mapping[c] = pd.factorize(df[c])

जूलियन के mcve का उपयोग कर उत्पादन होगा:

In [3]: print(df)
Out[3]: 
    a   b   c   d
0   0   0   0   0.155463
1   1   1   1   0.496427
2   0   0   2   0.168625
3   2   0   1   0.209681
4   0   2   1   0.661857

In [4]: print(label_mapping)
Out[4]:
{'a': Index(['Var2', 'Var3', 'Var1'], dtype='object'),
 'b': Index(['Var2', 'Var1', 'Var3'], dtype='object'),
 'c': Index(['Var3', 'Var2', 'Var1'], dtype='object')}

objectकॉलम खोजने के लिए आपका कोड v उपयोगी है।
जवदाबा

6

सबसे पहले, चलो खेलने के लिए एक mcve बनाएँ :

import pandas as pd
import numpy as np

In [1]: categorical_array = np.random.choice(['Var1','Var2','Var3'],
                                             size=(5,3), p=[0.25,0.5,0.25])
        df = pd.DataFrame(categorical_array,
               columns=map(lambda x:chr(97+x), range(categorical_array.shape[1])))
        # Add another column that isn't categorical but float
        df['d'] = np.random.rand(len(df))
        print(df)

Out[1]:
      a     b     c         d
0  Var3  Var3  Var3  0.953153
1  Var1  Var2  Var1  0.924896
2  Var2  Var2  Var2  0.273205
3  Var2  Var1  Var3  0.459676
4  Var2  Var1  Var1  0.114358

अब हम पहले तीन कॉलम को एनकोड करने के लिए pd.get_dummies का उपयोग कर सकते हैं।

ध्यान दें कि मैं drop_firstपैरामीटर का उपयोग कर रहा हूं क्योंकि N-1डमी पूरी तरह से Nसंभावनाओं का वर्णन करने के लिए पर्याप्त हैं (जैसे: यदि a_Var2और a_Var30 हैं, तो यह है a_Var1)। इसके अलावा, मैं विशेष रूप से स्तंभों को निर्दिष्ट कर रहा हूं, लेकिन मुझे यह करने की आवश्यकता नहीं है क्योंकि यह objectया तो dtype या categorical(नीचे अधिक) वाले कॉलम होंगे ।

In [2]: df_encoded = pd.get_dummies(df, columns=['a','b', 'c'], drop_first=True)
        print(df_encoded]
Out[2]:
          d  a_Var2  a_Var3  b_Var2  b_Var3  c_Var2  c_Var3
0  0.953153       0       1       0       1       0       1
1  0.924896       0       0       1       0       0       0
2  0.273205       1       0       1       0       1       0
3  0.459676       1       0       0       0       0       1
4  0.114358       1       0       0       0       0       0

अपने विशिष्ट एप्लिकेशन में, आपको कॉलम की एक सूची प्रदान करनी होगी जो श्रेणीबद्ध हैं, या आपको यह पता लगाना होगा कि कौन-से कॉलम श्रेणीबद्ध हैं।

बेस्ट स्थिति अपने dataframe पहले से ही एक साथ इन स्तंभ होते हैं dtype=categoryऔर आप पास कर सकते हैं columns=df.columns[df.dtypes == 'category']करने के लिए get_dummies

अन्यथा मैं dtypeअन्य सभी स्तंभों को उपयुक्त के रूप में स्थापित करने का सुझाव देता हूं (संकेत: pd.to_numeric, pd.to_datetime, आदि) और आपको उन स्तंभों के साथ छोड़ दिया जाएगा जिनमें एक objectdtype है और ये आपके श्रेणीबद्ध कॉलम होने चाहिए।

Pd.get_dummies पैरामीटर कॉलम डिफॉल्ट इस प्रकार है:

columns : list-like, default None
    Column names in the DataFrame to be encoded.
    If `columns` is None then all the columns with
    `object` or `category` dtype will be converted.

2

कई प्रकार के कॉलमों को एक बार में बदलने के लिए मैं कुछ इस तरह का उपयोग करूंगा:

df2 = df.select_dtypes(include = ['type_of_insterest'])

df2[df2.columns].apply(lambda x:x.astype('category'))

फिर मैं उन्हें वापस शामिल करूंगा original df


मुझे लगता df2[df2.columns] = df2[df2.columns].astype('category')है कि वही करता है, नहीं apply, नहीं lambda
पॉलपर्री
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.