পান্ডাস ডেটা ফ্রেমে শ্রেণিবদ্ধ ডেটা রূপান্তর করুন


106

এই ধরণের ডেটা (অনেক বেশি কলাম) সহ আমার একটি ডেটাফ্রেম রয়েছে:

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এবং পুরানো কলামগুলি ড্রপ করতে হবে।

এটা খারাপ অভ্যাস। এটি কাজ কিন্তু আমার ডেটাফ্রেমে অনেকগুলি কলাম আছে এবং আমি নিজে এটি করতে চাই না do

কীভাবে এই অজগরটি এবং কেবল চালাকভাবে?

উত্তর:


171

প্রথমত, তার সংখ্যাসূচক কোডগুলির একটি শ্রেণীগত কলাম রূপান্তর করতে, আপনার সাথে এই সহজ করতে পারেন: dataframe['c'].cat.codes
তদ্ব্যতীত, একটি ডেটাফ্রেম ব্যবহার করে একটি নির্দিষ্ট টাইপযুক্ত সমস্ত কলাম স্বয়ংক্রিয়ভাবে নির্বাচন করা সম্ভব 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
বিভাগের কোড এবং বিভাগের স্ট্রিংয়ের মানগুলির মধ্যে ম্যাপিংয়ের কী সহজ উপায় আছে?
অ্যালান রুইন

4
আপনি ব্যবহার করতে পারেন: df['col2'].cat.categoriesউদাহরণস্বরূপ।
ogrisel

13
সংশ্লিষ্ট যে এই ম্যাপ করবে কেউ জন্য ইশারা NaN'থেকে স্বতন্ত্র গুলি-1
quietContest

4
2 লাইনারগুলিকে ভালবাসুন;)
জোসে এ

cat.codesসতর্কতা অবলম্বন করুন যে যদি শ্রেণিবিন্যাসটি আদেশ করা হয় (একটি অর্ডিনাল) তবে সেই সংখ্যার কোডগুলি ফিরে এসেছে যা আপনি সিরিজে দেখছেন না!
পলপ্রিটি


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

ডেটাসেট ডেটার কলাম সিতে বিভাগীয় ডেটা রূপান্তর করার জন্য , আমাদের নিম্নলিখিতগুলি করতে হবে:

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

@ কুইকবিয়াম 2 কে 1, নীচে দেখুন -

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])

4
কেন আপনি কেবল আপনার আগের উত্তরটি সংশোধন করেন নি? আশ্চর্যজনকভাবে, আপনি লেবেলকনোডার সংজ্ঞা fit_transformপরিবর্তে এখন ব্যবহার করছেন transform_fitএবং সংশোধন করেছেন। আপনি কেন ব্যবহার করবেন iloc[:,:]? এটি অকেজো। ছবিটির পিছনে কারণ কী? আপনি যদি আমাকে এবং @ttgtknerd কাঁচা প্রমাণ করতে চেয়েছিলেন তবে আপনি ব্যর্থ হয়েছেন।
কুইকবিয়াম 2 কে 1

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))

0

শ্রেণীবদ্ধ ভেরিয়েবলকে ডামি / ইন্ডিকেটর ভেরিয়েবলে রূপান্তর করার একটি সহজ উপায় হ'ল পান্ডাস দ্বারা সরবরাহিত get_dummy ব্যবহার করা । উদাহরণস্বরূপ বলুন যে আমাদের কাছে এমন ডেটা রয়েছে যাতে sexএকটি শ্রেণিবদ্ধ মান (পুরুষ ও মহিলা) হয় এবং এটি কীভাবে করা যায় তা আপনাকে এখানে ডামি / সূচকতে রূপান্তর করতে হবে।

tranning_data = pd.read_csv("../titanic/train.csv")
features = ["Age", "Sex", ] //here sex is catagorical value
X_train = pd.get_dummies(tranning_data[features])
print(X_train)

Age Sex_female Sex_male
20    0          1
33    1          0
40    1          0
22    1          0
54    0          1


0

আপনি নীচের মত কম কোড এটি করতে পারেন:

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

f['col1'] =f['col1'].astype('category').cat.codes
f['col2'] =f['col2'].astype('category').cat.codes
f['col3'] =f['col3'].astype('category').cat.codes

f

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.