पांडा डेटाफ़्रेम में श्रेणीबद्ध डेटा परिवर्तित करें


102

मेरे पास इस प्रकार के डेटा के साथ एक डेटाफ्रेम है (बहुत सारे कॉलम):

col1        int64
col2        int64
col3        category
col4        category
col5        category

कॉलम इस तरह लगता है:

Name: col3, dtype: category
Categories (8, object): [B, C, E, G, H, N, S, W]

मैं स्तंभों में सभी मान को पूर्णांक में बदलना चाहता हूं:

[1, 2, 3, 4, 5, 6, 7, 8]

मैंने इसके लिए इसे एक कॉलम में हल किया:

dataframe['c'] = pandas.Categorical.from_array(dataframe.col3).codes

अब मेरे डेटाफ़्रेम में दो कॉलम हैं - पुराने col3और नए cऔर पुराने कॉलम को छोड़ने की आवश्यकता है।

यह बुरा अभ्यास है। यह काम है, लेकिन मेरे डेटाफ़्रेम में कई कॉलम हैं और मैं इसे मैन्युअल रूप से नहीं करना चाहता।

यह कैसे अजगर और सिर्फ चतुराई से?

जवाबों:


164

सबसे पहले, एक संख्यात्मक कॉलम को उसके संख्यात्मक कोड में बदलने के लिए, आप इसके साथ यह आसान कर सकते हैं dataframe['c'].cat.codes:।
इसके अलावा, डेटाफ़्रेम का उपयोग करके एक निश्चित dtype के साथ स्वचालित रूप से सभी कॉलम का चयन करना संभव है select_dtypes। इस तरह, आप कई और स्वचालित रूप से चयनित कॉलमों पर उपरोक्त ऑपरेशन को लागू कर सकते हैं।

पहले एक उदाहरण डेटाफ़्रेम बनाना:

In [75]: df = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),  'col3':list('ababb')})

In [76]: df['col2'] = df['col2'].astype('category')

In [77]: df['col3'] = df['col3'].astype('category')

In [78]: df.dtypes
Out[78]:
col1       int64
col2    category
col3    category
dtype: object

फिर select_dtypesकॉलम का चयन करने के लिए उपयोग करके , और फिर .cat.codesइनमें से प्रत्येक कॉलम पर आवेदन करके, आप निम्नलिखित परिणाम प्राप्त कर सकते हैं:

In [80]: cat_columns = df.select_dtypes(['category']).columns

In [81]: cat_columns
Out[81]: Index([u'col2', u'col3'], dtype='object')

In [83]: df[cat_columns] = df[cat_columns].apply(lambda x: x.cat.codes)

In [84]: df
Out[84]:
   col1  col2  col3
0     1     0     0
1     2     1     1
2     3     2     0
3     4     0     1
4     5     1     1

14
क्या कोई आसान तरीका है जिससे हमें श्रेणी कोड और श्रेणी स्ट्रिंग मानों के बीच मानचित्रण मिल सकता है?
एलन रुइन

5
आप उपयोग कर सकते हैं: df['col2'].cat.categoriesउदाहरण के लिए।
13

13
किसी के लिए इशारा करते हुए कहा कि यह NaNविशिष्ट रूप से-1
शांतचित्त

2
2 लाइनर्स से प्यार करें;)
जोस ए

यह देखें कि यदि श्रेणीबद्ध (एक क्रम) का आदेश दिया गया है, तो संख्यात्मक कोड जो आपके द्वारा cat.codesश्रृंखला में देखे गए हैं वे नहीं हो सकते हैं!
19

27

यह मेरे लिए काम करता है:

pandas.factorize( ['B', 'C', 'D', 'B'] )[0]

आउटपुट:

[0, 1, 2, 0]

20

यदि आपकी चिंता केवल यह थी कि आप एक अतिरिक्त कॉलम बना रहे हैं और बाद में इसे हटा रहे हैं, तो पहले स्थान पर एक नए कॉलम का उपयोग करें।

dataframe = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),  'col3':list('ababb')})
dataframe.col3 = pd.Categorical.from_array(dataframe.col3).codes

आप कर चुके हैं। अब के रूप Categorical.from_arrayमें पदावनत किया जाता है, Categoricalसीधे उपयोग करें

dataframe.col3 = pd.Categorical(dataframe.col3).codes

यदि आपको इंडेक्स से लेबल तक मैपिंग की आवश्यकता है, तो इसके लिए और भी बेहतर तरीका है

dataframe.col3, mapping_index = pd.Series(dataframe.col3).factorize()

नीचे देखें

print(dataframe)
print(mapping_index.get_loc("c"))

11

यहां कई कॉलमों को बदलना होगा। तो, एक दृष्टिकोण मैं इस्तेमाल किया है ..

for col_name in df.columns:
    if(df[col_name].dtype == 'object'):
        df[col_name]= df[col_name].astype('category')
        df[col_name] = df[col_name].cat.codes

यह सभी स्ट्रिंग / ऑब्जेक्ट प्रकार के कॉलम को श्रेणीबद्ध करता है। फिर प्रत्येक प्रकार की श्रेणी के लिए कोड लागू करता है।


3

डेटासेट डेटा के स्तंभ C में श्रेणीबद्ध डेटा परिवर्तित करने के लिए , हमें निम्नलिखित करने की आवश्यकता है:

from sklearn.preprocessing import LabelEncoder 
labelencoder= LabelEncoder() #initializing an object of class LabelEncoder
data['C'] = labelencoder.fit_transform(data['C']) #fitting and transforming the desired categorical column.

2

मैं जो करता हूं, वह करता हूं replace

ऐशे ही-

df['col'].replace(to_replace=['category_1', 'category_2', 'category_3'], value=[1, 2, 3], inplace=True)

इस तरह, यदि colस्तंभ में श्रेणीबद्ध मान हैं, तो वे संख्यात्मक मानों से बदल जाते हैं।


1

@ Quickbeam2k1, नीचे देखें -

dataset=pd.read_csv('Data2.csv')
np.set_printoptions(threshold=np.nan)
X = dataset.iloc[:,:].values

स्केलेन का उपयोग करना यहां छवि विवरण दर्ज करें

from sklearn.preprocessing import LabelEncoder
labelencoder_X=LabelEncoder()
X[:,0] = labelencoder_X.fit_transform(X[:,0])

3
आपने अपना पिछला उत्तर सही क्यों नहीं किया? हैरानी की बात है कि आप fit_transformअब इसके बजाय का उपयोग कर रहे हैं transform_fitऔर labencoder परिभाषा को सही किया। आप क्यों इस्तेमाल करते हैं iloc[:,:]? यह बेकार है। छवि के पीछे क्या कारण है? यदि आप मुझे और @ Gtknerd को विफल साबित करना चाहते हैं, तो आप विफल रहे।
Quickbeam2k1

0

एक निश्चित कॉलम के लिए, यदि आप ऑर्डर देने की परवाह नहीं करते हैं, तो इसका उपयोग करें

df['col1_num'] = df['col1'].apply(lambda x: np.where(df['col1'].unique()==x)[0][0])

यदि आप ऑर्डर देने की परवाह करते हैं, तो उन्हें एक सूची के रूप में निर्दिष्ट करें और इसका उपयोग करें

df['col1_num'] = df['col1'].apply(lambda x: ['first', 'second', 'third'].index(x))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.