পান্ডাসে শ্রেণিবদ্ধ কলামগুলি গণ রূপান্তর করুন (এক-গরম এনকোডিং নয়)


12

আমার কাছে টন শ্রেণিবদ্ধ কলামগুলির সাথে পান্ডাস ডেটাফ্রেম রয়েছে, যা আমি বিজ্ঞান-শিখার সাথে সিদ্ধান্ত গাছে ব্যবহার করার পরিকল্পনা করছি। আমি তাদেরকে সংখ্যাসূচক মানগুলিতে রূপান্তর করতে হবে (একটি উষ্ণ ভেক্টর নয়)। আমি এটি সাইকিট-লার্ন থেকে 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])

জুলিয়েনের এমসিভে ব্যবহার করে আউটপুট আসবে:

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কলামগুলি সন্ধান করার জন্য আপনার কোডটি দরকারী।
জাভাদবা

6

প্রথমে এর সাথে খেলতে একটি এমসিভে তৈরি করুন :

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_dummy ব্যবহার করতে পারি ।

নোট করুন যে আমি drop_firstপ্যারামিটারটি ব্যবহার করছি কারণ N-1ডামিগুলি Nসম্ভাবনার সম্পূর্ণ বিবরণ দেওয়ার জন্য যথেষ্ট (যেমন: যদি হয় a_Var2এবং a_Var30 হয় তবে এটি হয় a_Var1)। এছাড়াও, আমি বিশেষভাবে কলামগুলি নির্দিষ্ট করছি তবে এটির dtype objectবা 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

আপনার নির্দিষ্ট অ্যাপ্লিকেশনটিতে আপনাকে কলামের একটি তালিকা প্রদান করতে হবে যা শ্রেণিবদ্ধ, বা আপনাকে কোন কলামগুলি শ্রেণিবদ্ধ বলে নির্ধারণ করতে হবে।

আপনার ডেটাফ্রেমে ইতিমধ্যে সর্বোত্তম কেস দৃশ্যের সাথে এই কলামগুলি রয়েছে dtype=categoryএবং আপনি এতে যেতে columns=df.columns[df.dtypes == 'category']পারেন get_dummies

অন্যথায় আমি dtypeঅন্য সমস্ত কলামগুলিকে যথাযথ হিসাবে সেট করার পরামর্শ দিচ্ছি (ইঙ্গিত: pd.to_numeric, pd.to_datetime, ইত্যাদি) এবং আপনি একটি objectdtype আছে কলাম সঙ্গে ছেড়ে যাবে এবং এগুলি আপনার শ্রেণীবদ্ধ কলাম হতে হবে।

পিডি.গেট_ডমিজ প্যারামিটার কলামগুলি ডিফল্ট হিসাবে নিম্নরূপ:

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
31:30 '
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.