স্ক্যান্ডার্ন দিয়ে প্যান্ডাস ডেটা ফ্রেম কলামগুলি স্কেলিং


137

আমার কাছে মিশ্র প্রকারের কলামগুলির সাথে একটি পান্ডাস ডেটা ফ্রেম রয়েছে এবং আমি কিছু কলামে স্ক্লার্ন এর মিনি_ম্যাক্স_স্কেলার প্রয়োগ করতে চাই। আদর্শভাবে, আমি এই জায়গায় রূপান্তরগুলি করতে চাই, তবে এখনও এটি করার কোনও উপায় খুঁজে পাইনি। আমি নিম্নলিখিত কোড লিখেছি যা কাজ করে:

import pandas as pd
import numpy as np
from sklearn import preprocessing

scaler = preprocessing.MinMaxScaler()

dfTest = pd.DataFrame({'A':[14.00,90.20,90.95,96.27,91.21],'B':[103.02,107.26,110.35,114.23,114.68], 'C':['big','small','big','small','small']})
min_max_scaler = preprocessing.MinMaxScaler()

def scaleColumns(df, cols_to_scale):
    for col in cols_to_scale:
        df[col] = pd.DataFrame(min_max_scaler.fit_transform(pd.DataFrame(dfTest[col])),columns=[col])
    return df

dfTest

    A   B   C
0    14.00   103.02  big
1    90.20   107.26  small
2    90.95   110.35  big
3    96.27   114.23  small
4    91.21   114.68  small

scaled_df = scaleColumns(dfTest,['A','B'])
scaled_df

A   B   C
0    0.000000    0.000000    big
1    0.926219    0.363636    small
2    0.935335    0.628645    big
3    1.000000    0.961407    small
4    0.938495    1.000000    small

যদি আমি এই রূপান্তরটি সবচেয়ে পছন্দসই / সবচেয়ে কার্যকর উপায় হয় তবে আমি আগ্রহী। আমি কোন উপায় df.apply ব্যবহার করতে পারেন যে ভাল হবে?

আমিও অবাক হয়েছি আমি নিম্নলিখিত কোডটি কাজ করতে পারি না:

bad_output = min_max_scaler.fit_transform(dfTest['A'])

যদি আমি স্কেলারের কাছে একটি পুরো ডেটাফ্রেম পাস করি তবে এটি কাজ করে:

dfTest2 = dfTest.drop('C', axis = 1) good_output = min_max_scaler.fit_transform(dfTest2) good_output

আমি বিভ্রান্ত কারণ কেন স্কেলারের কাছে একটি সিরিজ পাস করা ব্যর্থ। উপরের আমার সম্পূর্ণ কার্যকারী কোডে আমি কেবলমাত্র স্কেলারের কাছে একটি সিরিজ পাস করার প্রত্যাশা করেছিলাম তারপর ডেটাফ্রেম কলাম = ছোট আকারের সিরিজে সেট করেছিলাম। আমি এই প্রশ্নটি আরও কয়েকটি জায়গায় জিজ্ঞাসা করেছি, কিন্তু ভাল উত্তর খুঁজে পাইনি। এখানে কী চলছে তা বোঝার জন্য কোনও সহায়তার প্রশংসা করা হবে!


1
আপনি যদি এটি করেন তবে এটি কাজ করে bad_output = min_max_scaler.fit_transform(dfTest['A'].values)? valuesঅ্যাট্রিবিউটটি অ্যাক্সেস করা একটি অদ্ভুত অ্যারে প্রদান করে, কোনও কারণে সাইকিট শিখতে এপিআই সঠিকভাবে ডান পদ্ধতিটি কল করবে যা পান্ডাসকে একটি অদ্ভুত অ্যারে প্রদান করে এবং কখনও কখনও তা করে না।
এডচাম

পান্ডাদের ডেটাফ্রেমগুলি এমন একটি কনভেনশনগুলির সাথে জটিল যেগুলি বৈজ্ঞানিক-শিখার সম্মেলনের সাথে মেলে না with আপনি যদি সবকিছু NumPy অ্যারে রূপান্তর করেন, সাইকিট শিখতে কাজ করা অনেক সহজ হয়ে যায়।
ফ্রেড ফু

@edChum - কাজও bad_output = in_max_scaler.fit_transform(dfTest['A'].values)করেনি। @ এলারসম্যানস - হ্যাঁ আমি এই রুটে নেমে যাওয়ার কথা ভেবেছিলাম, এটিকে কেবল কোনও ঝামেলার মতো মনে হচ্ছে। আমি জানি না এটি কোনও ত্রুটিযুক্ত কিনা বা তা নয় যে পান্ডারা একটি স্ক্যালার্ন ফাংশনে পুরো ডেটাফ্রেম দিতে পারে, তবে কোনও সিরিজ নয়। ডেটাফ্রেমের বিষয়ে আমার বোঝা ছিল যে এটি সিরিজের একটি ডিক। "ডেথ অ্যানালাইসিসের জন্য পাইথন" বইয়ে পড়া, এটিতে বলা হয়েছে যে পান্ডগুলি নম্পপি-কেন্দ্রিক প্রয়োগগুলিতে সহজেই ব্যবহার করার জন্য নিমপির উপরে তৈরি করা হয়েছে।
ফ্লাইং মিটবল

উত্তর:


214

পূর্ববর্তী সংস্করণগুলি pandasএটিকে প্রতিরোধ করেছে কিনা তা সম্পর্কে আমি নিশ্চিত নই তবে এখন নীচের স্নিপেটটি আমার পক্ষে পুরোপুরি কার্যকরভাবে কাজ করে এবং আপনি যা ব্যবহার না করে ঠিক যা চান তা উত্পাদন করেapply

>>> import pandas as pd
>>> from sklearn.preprocessing import MinMaxScaler


>>> scaler = MinMaxScaler()

>>> dfTest = pd.DataFrame({'A':[14.00,90.20,90.95,96.27,91.21],
                           'B':[103.02,107.26,110.35,114.23,114.68],
                           'C':['big','small','big','small','small']})

>>> dfTest[['A', 'B']] = scaler.fit_transform(dfTest[['A', 'B']])

>>> dfTest
          A         B      C
0  0.000000  0.000000    big
1  0.926219  0.363636  small
2  0.935335  0.628645    big
3  1.000000  0.961407  small
4  0.938495  1.000000  small

80
ঝরঝরে! আরও সাধারণ সংস্করণdf[df.columns] = scaler.fit_transform(df[df.columns])
সিটিএনরম্যান

6
@ রাজেশেভর বাইরের বন্ধনীগুলি হ'ল পান্ডাসের সাধারণ নির্বাচক বন্ধনীগুলি, প্যানডাকে ডেটাফ্রেম থেকে একটি কলাম নির্বাচন করতে বলছে। অভ্যন্তর বন্ধনীগুলি একটি তালিকা নির্দেশ করে। আপনি পান্ডা নির্বাচককে একটি তালিকা দিচ্ছেন passing যদি আপনি কেবল একক বন্ধনী ব্যবহার করেন - যার সাথে একটি কলামের নাম এবং পরে একটি কমা দ্বারা পৃথক করা হয় - পান্ডাস এটিকে ব্যাখ্যা করে যেমন আপনি মাল্টি-লেভেল কলামগুলি (একটি মাল্টিআইডেক্স) দিয়ে একটি ডেফ্রেম থেকে একটি কলাম নির্বাচন করার চেষ্টা করছেন এবং একটি কিয়েরর ফেলে দেবেন ।
কেনে

1
@ কেনের উত্তর যুক্ত করতে যদি আপনি দেখতে চান যে পান্ডারা কীভাবে এই সূচক যুক্তিকে বাস্তবায়ন করে এবং মানগুলির একটি দ্বিগুণ তালিকার চেয়ে আলাদাভাবে কীভাবে ব্যাখ্যা করা হবে আপনি কীভাবে ডেটাফ্রেমগুলি __getitem__পদ্ধতিটি প্রয়োগ করেন তা দেখতে পারেন । বিশেষত আপনি আইপিথন খুলতে এবং করতে পারেন pd.DataFrame.__getitem__??; অবশ্যই
প্যান্ডস

4
একটি ব্যবহারিক নোট: ট্রেন / পরীক্ষা ডেটা বিভক্তকারীদের জন্য, আপনি কেবল আপনার পরীক্ষার ডেটা নয়, কেবল আপনার প্রশিক্ষণের ডেটাতে ফিট করতে চাইবেন।
ডেভিড জে

1
সব আকার পরিবর্তন করতে কিন্তু কলাম টাইমস্ট্যাম্প, সঙ্গে মেশা columns =df.columns.drop('timestamps') df[df.columns] = scaler.fit_transform(df[df.columns]
intotecho

19

এটার মত?

dfTest = pd.DataFrame({
           'A':[14.00,90.20,90.95,96.27,91.21],
           'B':[103.02,107.26,110.35,114.23,114.68], 
           'C':['big','small','big','small','small']
         })
dfTest[['A','B']] = dfTest[['A','B']].apply(
                           lambda x: MinMaxScaler().fit_transform(x))
dfTest

    A           B           C
0   0.000000    0.000000    big
1   0.926219    0.363636    small
2   0.935335    0.628645    big
3   1.000000    0.961407    small
4   0.938495    1.000000    small

3
আমি যখন এই স্ক্রিপ্টটি চালাব তখন আমি একগুচ্ছ অবনতি ওয়ার্নিং পেয়েছি। কীভাবে এটি আপডেট করা উচিত?
পীর

নীচে @ লেটসপ্লেইয়াহটজি এর উত্তর দেখুন
এজেপি

2
একটি সহজ সংস্করণ: dfTest [['A', 'বি']] = dfTest [['এ', 'বি']]। প্রয়োগ করুন (মিনিম্যাক্সস্কেলার ()। ফিট_ট্রান্সফর্ম)
আলেকজান্দ্রে ভি।

12

এটি পীরের মন্তব্যে যেমন উল্লেখ করা হচ্ছে - .apply(lambda el: scale.fit_transform(el))পদ্ধতিটি নিম্নলিখিত সতর্কতা উত্পন্ন করবে:

অবচয়করণ সতর্কতা: ডেটা হিসাবে 1 ডি অ্যারে পাস করা 0.17-এ অবমূল্যায়িত হয় এবং 0.19-এ মান বাড়িয়ে তুলবে। আপনার ডেটাতে যদি একটি একক বৈশিষ্ট্য থাকে তবে এটিতে কোনও একক নমুনা থাকলে X.reshape (-1, 1) ব্যবহার করে আপনার ডেটা পুনরায় আকার দিন।

আপনার কলামগুলি ন্যালি অ্যারেগুলিতে রূপান্তর করার কাজটি করা উচিত (আমি স্ট্যান্ডার্ডস্কেলারের পছন্দ করি):

from sklearn.preprocessing import StandardScaler
scale = StandardScaler()

dfTest[['A','B','C']] = scale.fit_transform(dfTest[['A','B','C']].as_matrix())

- নভেম্বর 2018 সম্পাদনা করুন (প্যান্ডাস 0.23.4 এর জন্য পরীক্ষিত ) -

হিসাবে রব মারে মন্তব্য উল্লেখ করেছে, পান্ডাস এর বর্তমান (v0.23.4) সংস্করণে .as_matrix()আয় FutureWarning। সুতরাং, এটি দ্বারা প্রতিস্থাপন করা উচিত .values:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()

scaler.fit_transform(dfTest[['A','B']].values)

- মে 2019 সম্পাদনা করুন ( 0.24.2 প্যান্ডাসের জন্য পরীক্ষিত ) -

জোয়েস্টব্লম মন্তব্যগুলিতে যেমন উল্লেখ করেছেন, "যেহেতু 0.24.0, .to_numpy()পরিবর্তে এটি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে .values।"

আপডেট হওয়া উদাহরণ:

import pandas as pd
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
dfTest = pd.DataFrame({
               'A':[14.00,90.20,90.95,96.27,91.21],
               'B':[103.02,107.26,110.35,114.23,114.68],
               'C':['big','small','big','small','small']
             })
dfTest[['A', 'B']] = scaler.fit_transform(dfTest[['A','B']].to_numpy())
dfTest
      A         B      C
0 -1.995290 -1.571117    big
1  0.436356 -0.603995  small
2  0.460289  0.100818    big
3  0.630058  0.985826  small
4  0.468586  1.088469  small

1
ব্যবহার .valuesস্থানে .as_matrix()যেমন as_matrix()এখন একটি দেয় FutureWarning
রব মারে


10
df = pd.DataFrame(scale.fit_transform(df.values), columns=df.columns, index=df.index)

অবচয় সতর্কতা ছাড়াই এটি কাজ করা উচিত।


7

আপনি pandasকেবল এটি ব্যবহার করে করতে পারেন :

In [235]:
dfTest = pd.DataFrame({'A':[14.00,90.20,90.95,96.27,91.21],'B':[103.02,107.26,110.35,114.23,114.68], 'C':['big','small','big','small','small']})
df = dfTest[['A', 'B']]
df_norm = (df - df.min()) / (df.max() - df.min())
print df_norm
print pd.concat((df_norm, dfTest.C),1)

          A         B
0  0.000000  0.000000
1  0.926219  0.363636
2  0.935335  0.628645
3  1.000000  0.961407
4  0.938495  1.000000
          A         B      C
0  0.000000  0.000000    big
1  0.926219  0.363636  small
2  0.935335  0.628645    big
3  1.000000  0.961407  small
4  0.938495  1.000000  small

6
আমি জানি যে আমি এটি কেবল প্যান্ডাসেই করতে পারি, তবে আমি শেষ পর্যন্ত একটি আলাদা স্কলার্ন পদ্ধতি প্রয়োগ করতে চাই যা নিজের লেখার মতো সহজ নয়। আমি কঠোরতর সরল সমাধান নিয়ে আসার চেয়ে যতটা প্রত্যাশা করেছি তার চেয়ে কেন সিরিজটিতে প্রয়োগ করা কার্যকর হয় না তা জানার বিষয়ে আমি আগ্রহী। আমার পরবর্তী পদক্ষেপটি একটি র‌্যান্ডমফোরস্টগ্রিজার চালানো হবে এবং আমি নিশ্চিত করতে চাই যে আমি কীভাবে পান্ডা এবং স্ক্লার্ন একসাথে কাজ করি understand
ফ্লাইং মিটবল

5
এই উত্তরটি বিপজ্জনক কারণ df.max() - df.min()এটি 0 হতে পারে, একটি ব্যতিক্রমের দিকে পরিচালিত করে। অধিকন্তু, df.min()দুইবার যা অদক্ষ হয় নির্ণয় করা হয়। df.ptp()সমান যে নোট df.max() - df.min()
একিউম্যানাস

3

আমি জানি এটি একটি পুরানো মন্তব্য, তবে এখনও:

একক বন্ধনী ব্যবহারের পরিবর্তে (dfTest['A']), ডাবল বন্ধনী ব্যবহার করুন (dfTest[['A']])

অর্থাৎ, min_max_scaler.fit_transform(dfTest[['A']])

আমি বিশ্বাস করি এটি পছন্দসই ফলাফল দেবে।

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