পান্ডায় ডেটা সাধারণকরণ


131

ধরুন আমার কাছে পান্ডসের ডেটা ফ্রেম রয়েছে df:

আমি একটি ডেটা ফ্রেমের কলাম কমান্ড গণনা করতে চাই।

এটা সহজ:

df.apply(average) 

তারপরে কলাম অনুসারে পরিসীমা সর্বাধিক (করল) - মিনিট (কল)। এটি আবার সহজ:

df.apply(max) - df.apply(min)

এখন প্রতিটি উপাদানের জন্য আমি এর কলামটির গড় বিয়োগ করতে এবং তার কলামের ব্যাপ্তি দ্বারা ভাগ করতে চাই। কীভাবে করব তা নিশ্চিত নই

যে কোনও সহায়তা / পয়েন্টারগুলি প্রশংসিত হয়।

উত্তর:


225
In [92]: df
Out[92]:
           a         b          c         d
A  -0.488816  0.863769   4.325608 -4.721202
B -11.937097  2.993993 -12.916784 -1.086236
C  -5.569493  4.672679  -2.168464 -9.315900
D   8.892368  0.932785   4.535396  0.598124

In [93]: df_norm = (df - df.mean()) / (df.max() - df.min())

In [94]: df_norm
Out[94]:
          a         b         c         d
A  0.085789 -0.394348  0.337016 -0.109935
B -0.463830  0.164926 -0.650963  0.256714
C -0.158129  0.605652 -0.035090 -0.573389
D  0.536170 -0.376229  0.349037  0.426611

In [95]: df_norm.mean()
Out[95]:
a   -2.081668e-17
b    4.857226e-17
c    1.734723e-17
d   -1.040834e-17

In [96]: df_norm.max() - df_norm.min()
Out[96]:
a    1
b    1
c    1
d    1

আপনি যদি কোনও উপসেটটি স্বাভাবিক করতে চান তবে এটি করার কোনও উপায় আছে কি? এই সারিটি বলুন Aএবং Bবৃহত্তর গ্রুপিং ফ্যাক্টরের অংশ যা আপনি Cএবং থেকে পৃথক করে স্বাভাবিক করতে চান D
অ্যামিউনিয়াস

পূর্বের মতো সাবসেটটি এবং গণনা নির্বাচন করুন। কীভাবে ইনডেক্স এবং ডাটা নির্বাচন করবেন সে সম্পর্কে pandas.pydata.org/pandas-docs/stable/indexing.html দেখুন
ওয়াটার ওভারমিয়ার

17
আপনার মানগুলি যদি> 0: df_norm = (df - df.min ()) / (df.max () - df.min ()) হতে হয়
Dayvid Oliveira

1
0 থেকে 1 এর মধ্যে মানগুলি পাওয়ার জন্য প্রথম বন্ধনীতে df.mean () এর চেয়ে df_norm = (df - df.min ()) / (df.max () - df.min ()) হওয়া উচিত
jnPy

2
যদি আপনার ডেটাফ্রেমে কিছু কলামে স্ট্রিং থাকে তবে এই উত্তরটি দেখুন
নেটস্কিঙ্ক

73

আপনি যদি sklearnগ্রন্থাগারটি আমদানি করতে আপত্তি না করেন তবে আমি এই ব্লগে কথা বলার পদ্ধতিটি সুপারিশ করব ।

import pandas as pd
from sklearn import preprocessing

data = {'score': [234,24,14,27,-74,46,73,-18,59,160]}
cols = data.columns
df = pd.DataFrame(data)
df

min_max_scaler = preprocessing.MinMaxScaler()
np_scaled = min_max_scaler.fit_transform(df)
df_normalized = pd.DataFrame(np_scaled, columns = cols)
df_normalized

2
ব্লগ পোস্টের লিঙ্কটি মারা গেছে। আপনার কি কাজ করা আছে?
মার্চ

3
ইউনিট-স্বাভাবিক নরমালাইজড ডেটা তৈরির জন্য সম্পর্কিত পদ্ধতিটিকে স্ট্যান্ডার্ডস্কেলার বলে।
abeboparebop

আমি একই জায়গায় একই জায়গায় সন্ধান পেয়েছি। সমস্যাটি ছিল যে এনপি_স্কেল করা অংশে এটি 2D অ্যারে প্রত্যাশা করে একটি ত্রুটি দেখিয়েছিল তবে ইনপুটটি 1 ডি অ্যারে এবং এটি সুপারিশ করেছে যে আমরা পুনরায় আকার (-1,1) ব্যবহার করব। পুনরায় আকার হিসাবে এটি সমাধান করার কোনও ধারণাও কাজ করছে না
ডেডকোড

আপনি নম্পতি এবং স্ক্লার্ননের কোন সংস্করণ নিয়ে কাজ করছেন তার উপর নির্ভর করে আপনি সতর্কতা পেতে পারেন, তবে সাধারণভাবে এটি কাজ করা উচিত np_scaled = min_max_scaler.fit_transform(df.score.astype(float).values.reshape(-1, 1))
জায়েওং চুন

33

আপনি applyএটির জন্য ব্যবহার করতে পারেন এবং এটি কিছুটা পরিষ্কার:

import numpy as np
import pandas as pd

np.random.seed(1)

df = pd.DataFrame(np.random.randn(4,4)* 4 + 3)

          0         1         2         3
0  9.497381  0.552974  0.887313 -1.291874
1  6.461631 -6.206155  9.979247 -0.044828
2  4.276156  2.002518  8.848432 -5.240563
3  1.710331  1.463783  7.535078 -1.399565

df.apply(lambda x: (x - np.mean(x)) / (np.max(x) - np.min(x)))

          0         1         2         3
0  0.515087  0.133967 -0.651699  0.135175
1  0.125241 -0.689446  0.348301  0.375188
2 -0.155414  0.310554  0.223925 -0.624812
3 -0.484913  0.244924  0.079473  0.114448

এছাড়াও, groupbyআপনি যদি প্রাসঙ্গিক কলামগুলি নির্বাচন করেন তবে এটি সুন্দরভাবে কাজ করে:

df['grp'] = ['A', 'A', 'B', 'B']

          0         1         2         3 grp
0  9.497381  0.552974  0.887313 -1.291874   A
1  6.461631 -6.206155  9.979247 -0.044828   A
2  4.276156  2.002518  8.848432 -5.240563   B
3  1.710331  1.463783  7.535078 -1.399565   B


df.groupby(['grp'])[[0,1,2,3]].apply(lambda x: (x - np.mean(x)) / (np.max(x) - np.min(x)))

     0    1    2    3
0  0.5  0.5 -0.5 -0.5
1 -0.5 -0.5  0.5  0.5
2  0.5  0.5  0.5 -0.5
3 -0.5 -0.5 -0.5  0.5

2

এর থেকে কিছুটা সংশোধন করা হয়েছে: পাইথন পান্ডাস ডেটাফ্রেম: 0.01 এবং 0.99 এর মধ্যে ডেটা স্বাভাবিক করুন? তবে কিছু মন্তব্য থেকে এটি প্রাসঙ্গিক বলে মনে হয়েছিল (দুঃখিত, যদিও এটি পুনরায় পোস্ট করা বিবেচনা করা হয় ...)

আমি ডাটাম বা জেড-স্কোরের নিয়মিত শতকরা পর্যাপ্ত ছিল না এমন কাস্টমাইজড নরমালাইজেশন চেয়েছিলাম। কখনও কখনও আমি জানতাম যে জনসংখ্যার সম্ভাব্য সর্বোচ্চ এবং সর্বনিম্ন মিনিট কী এবং তাই এটি আমার নমুনা, বা অন্য কোনও মিডপয়েন্ট বা অন্য যে কোনও কিছু ছাড়া অন্য কোনও সংজ্ঞা দিতে চেয়েছিল! এটি প্রায়শই নিউরাল নেটগুলির জন্য ডেটা পুনরুদ্ধার এবং সাধারণকরণের জন্য দরকারী হতে পারে যেখানে আপনি 0 থেকে 1 এর মধ্যে সমস্ত ইনপুট চাইতে পারেন তবে আপনার কিছু ডেটা আরও কাস্টমাইজড উপায়ে স্কেল করা দরকার হতে পারে ... কারণ পার্সেন্টাইলস এবং স্টেডিভগুলি আপনার নমুনা কভারগুলি ধরে নিয়েছে জনসংখ্যা, কিন্তু কখনও কখনও আমরা জানি এটি সত্য নয়। হিটম্যাপে ডেটা ভিজ্যুয়ালাইজ করার সময় এটি আমার পক্ষে খুব কার্যকর ছিল। সুতরাং আমি একটি কাস্টম ফাংশন তৈরি করেছি (কোডটিকে এটি যথাসম্ভব পাঠযোগ্য করে তোলার জন্য এখানে অতিরিক্ত পদক্ষেপ ব্যবহার করা হয়েছে):

def NormData(s,low='min',center='mid',hi='max',insideout=False,shrinkfactor=0.):    
    if low=='min':
        low=min(s)
    elif low=='abs':
        low=max(abs(min(s)),abs(max(s)))*-1.#sign(min(s))
    if hi=='max':
        hi=max(s)
    elif hi=='abs':
        hi=max(abs(min(s)),abs(max(s)))*1.#sign(max(s))

    if center=='mid':
        center=(max(s)+min(s))/2
    elif center=='avg':
        center=mean(s)
    elif center=='median':
        center=median(s)

    s2=[x-center for x in s]
    hi=hi-center
    low=low-center
    center=0.

    r=[]

    for x in s2:
        if x<low:
            r.append(0.)
        elif x>hi:
            r.append(1.)
        else:
            if x>=center:
                r.append((x-center)/(hi-center)*0.5+0.5)
            else:
                r.append((x-low)/(center-low)*0.5+0.)

    if insideout==True:
        ir=[(1.-abs(z-0.5)*2.) for z in r]
        r=ir

    rr =[x-(x-0.5)*shrinkfactor for x in r]    
    return rr

এটি একটি পান্ডাস সিরিজ নেবে, এমনকি কেবল একটি তালিকা এবং এটি আপনার নির্দিষ্ট নিম্ন, কেন্দ্র এবং উচ্চ পয়েন্টগুলিতে সাধারণীকরণ করবে। এছাড়াও একটি সঙ্কুচিত ফ্যাক্টর আছে! আপনাকে শেষ পয়েন্ট 0 এবং 1 থেকে দূরে ডেটা স্কেল করার অনুমতি দেওয়ার জন্য ( ম্যাটপ্ল্লোলিবতে রঙিনম্যাপগুলি একত্রিত করার সময় আমি এটি করতে হয়েছিলাম : ম্যাটপ্ল্লোলিব ব্যবহার করে একাধিক কালারম্যাপের সাথে একক পিক্লোরমেশ ) সুতরাং আপনি সম্ভবত কোডটি কীভাবে কাজ করে তা দেখতে পারেন, তবে মূলত আপনাকে বলে একটি নমুনায় মান রয়েছে [-5,1,10], তবে 2-এর মিডপয়েন্ট সহ -7 থেকে 7 এর পরিসরের উপর ভিত্তি করে স্বাভাবিক করতে চান (সুতরাং 7 এর উপরে যে কোনও কিছু আমাদের "10" কে কার্যকরভাবে 7 হিসাবে বিবেচনা করা হবে), তবে এটি একটি 256 আরজিবি রঙিন মানচিত্রের সাথে মানানসই করুন:

#In[1]
NormData([-5,2,10],low=-7,center=1,hi=7,shrinkfactor=2./256)
#Out[1]
[0.1279296875, 0.5826822916666667, 0.99609375]

এটি আপনার ডেটাও ভিতরে turnুকে দিতে পারে ... এটি অদ্ভুত মনে হতে পারে তবে হিটম্যাপিংয়ের জন্য আমি এটি দরকারী বলে মনে করেছি। বলুন যে আপনি উচ্চ / নিম্নের চেয়ে 0 এর কাছাকাছি মানের জন্য আরও গা .় রঙ চান। আপনি যেখানে আউটআউট = সত্য তা স্বাভাবিকের উপর ভিত্তি করে হিটম্যাপ করতে পারেন could

#In[2]
NormData([-5,2,10],low=-7,center=1,hi=7,insideout=True,shrinkfactor=2./256)
#Out[2]
[0.251953125, 0.8307291666666666, 0.00390625]

সুতরাং এখন "2" যা কেন্দ্রের নিকটতম, "1" হিসাবে সংজ্ঞায়িত সর্বোচ্চ মান।

যাইহোক, আমি ভেবেছিলাম আমার অ্যাপ্লিকেশনটি প্রাসঙ্গিক যদি আপনি অন্যভাবে ডেটা পুনরুদ্ধার করতে চান যা আপনার পক্ষে দরকারী অ্যাপ্লিকেশন থাকতে পারে।


আপনি সমস্ত if / অন্য বিবৃতি ফাংশন সহ একটি অভিধান দ্বারা প্রতিস্থাপন করতে পারেন । তখন কিছুটা পরিষ্কার পরিচ্ছন্ন লাগছে।
রোয়াল্ড

এটি বেশ ঝরঝরে, আমি পরের বার এটি মনে রাখব, ধন্যবাদ!
ভ্লাক্স

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