পান্ডাস ডেটা ফ্রেমে সারিগুলিতে পুনরাবৃত্তি করে নতুন কলাম তৈরি করা হচ্ছে


10

আমার কাছে এর মতো একটি পান্ডাস ডেটা ফ্রেম রয়েছে (এক্স 11): আসলে আমার কাছে ডেক্স 99 পর্যন্ত 99 কলাম রয়েছে

    dx1      dx2    dx3    dx4
0   25041   40391   5856    0
1   25041   40391   25081   5856
2   25041   40391   42822   0
3   25061   40391   0       0
4   25041   40391   0       5856
5   40391   25002   5856    3569

আমি 25041,40391,5856 ইত্যাদির মতো সেল মানগুলির জন্য অতিরিক্ত কলাম (গুলি) তৈরি করতে চাই So আমি এই কোডটি ব্যবহার করছি এবং সারিগুলির সংখ্যা কম হলে এটি কাজ করে।

mat = X11.as_matrix(columns=None)
values, counts = np.unique(mat.astype(str), return_counts=True)

for x in values:
    X11[x] = X11.isin([x]).any(1).astype(int)

আমি এর মতো ফলাফল পাচ্ছি:

dx1     dx2     dx3    dx4  0   25002   25041   25061   25081   3569    40391   42822   5856
25041   40391   5856    0   0   0       1       0       0       0          1        0       1
25041   40391   25081  5856 0   0       1       0       1       0            1      0       1
25041   40391   42822   0   0   0       1       0       0       0           1       1       0
25061   40391   0       0   0   0       0       1       0       0          1        0       0
25041   40391   0    5856   0   0       1       0       0       0          1        0       1
40391   25002 5856   3569   0   1       0       0       0       1          1        0       1

সারিগুলির সংখ্যা যখন হাজারে বা লক্ষ লক্ষ হয়, এটি স্থায়ী হয় এবং চিরতরে লাগে এবং আমি কোনও ফল পাচ্ছি না। দয়া করে দেখুন যে কক্ষের মানগুলি কলামে অনন্য নয়, পরিবর্তে বহু কলামগুলিতে পুনরাবৃত্তি করছে। প্রাক্তন হিসাবে, 40391 dx1 তে পাশাপাশি dx2 তে ঘটছে এবং তাই 0 এবং 5856 ইত্যাদির জন্যও? উপরে বর্ণিত যুক্তিটি কীভাবে উন্নত করা যায় সে সম্পর্কে কোন ধারণা?


এই সমাধান করার কোন ধারণা? আমি এখনও এটি সমাধান করার অপেক্ষায় রয়েছি যেহেতু আমার ডেটা আরও বড় হয়ে উঠছে এবং বিদ্যমান সমাধানটি চিরকাল উত্পন্ন ডমি কলামগুলিতে নেয়।
সানোজ

উত্তর:


6

পান্ডাসে আরও অনেক অজস্র সমাধান রয়েছে ...

এটি আমার ল্যাপটপে 10 মিলিয়ন সারিতে এক সেকেন্ডেরও কম সময় নেয়:

for x in X11.E.unique():
    X11[x]=(X11.E==x).astype(int)
X11

এখানে বিস্তারিত বিবরণ দেওয়া হল:

সাধারণ ছোট ডেটাফ্রেম -

import numpy as np
import pandas as pd

X11 = pd.DataFrame(np.random.randn(6,4), columns=list('ABCD'))
X11['E'] = [25223, 112233,25223,14333,14333,112233]
X11

সাধারণ ছোট ডাটাফ্রেম

বিনেরাইজেশন পদ্ধতি -

for x in X11.E.unique():
    X11[x]=(X11.E==x).astype(int)
X11

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

10 মিলিয়ন সারি সহ ডেটাফ্রেম -

pd.set_option("display.max_rows",20)
X12 = pd.DataFrame(np.random.randn(10000000,4), columns=list('ABCD'))
foo = [25223, 112233,25223,14333,14333,112233]
bar=[]
import random
for x in range(10000000):
    bar.append(random.choice(foo))
X12['E'] = bar
X12

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

10 মিলিয়ন সারি ডেটাফ্রেমে টাইমড বাইনারিাইজেশন (ওরফে এক-হট এনকোডিং) -

import time
start = time.clock()

for x in X12.E.unique():
    X12[x]=(X12.E==x).astype(int)
elapsed = (time.clock() - start)

print "This is the time that this took in seconds: ",elapsed

X12

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

আশাকরি এটা সাহায্য করবে!


এটি আপনাকে লুপের জন্য কীভাবে ডামি মান (25041) এবং কলামের নামগুলি (অর্থাত্ dx1) পেতে হবে তা বলে না। আমি একবারে একটি মাত্র পেতে পারি
সানোজ

এখনই দেখুন। আমি সমস্ত বিবরণ যোগ।
AN6U5

আপনি "E" থেকে যেমনটি করেছেন ঠিক তেমন একটি কলামের ভিত্তিতে আমাকে ডামি মানগুলি তৈরি করার প্রয়োজন হলে আপনার সমাধানটি ভাল দেখাচ্ছে। তবে যখন আমাকে একাধিক কলাম থেকে এটি তৈরি করতে হবে এবং সেই সেল মানগুলি কোনও নির্দিষ্ট কলামের জন্য অনন্য নয় তবে সেই সমস্ত কলামগুলির জন্য আমাকে আবার আপনার কোডটি লুপ করতে হবে? যদি তা হয় তবে মানগুলির পুনরাবৃত্তি কীভাবে যত্ন নেওয়া হবে? অন্যথায় এটি একই নামের সাথে তৈরি পূর্ববর্তী ডামি কলামটি লিখে ফেলবে। কোনও বিভ্রান্তি ছিল কিনা তা পরিষ্কার করতে আমি উপরের প্রশ্নে আমার ফলাফল যুক্ত করেছি। যাইহোক আপনাকে এটি দেখার জন্য ধন্যবাদ।
সানোজ

4

দেখে মনে হচ্ছে আপনি একটি পান্ডাস ডেটা ফ্রেম কলাম থেকে ডামি ভেরিয়েবল তৈরি করতে চান। সৌভাগ্যবসত, পান্ডাস এটির জন্য একটি বিশেষ পদ্ধতি আছে: get_dummies()। এখানে একটি কোড স্নিপেট যা আপনি আপনার প্রয়োজনের জন্য মানিয়ে নিতে পারেন:

import pandas as pd
data = pd.read_clipboard(sep=',')

#get the names of the first 3 columns
colN = data.columns.values[:3]

#make a copy of the dataframe
data_transformed = data

#the get_dummies method is doing the job for you
for column_name in colN:
    dummies = pd.get_dummies(data_transformed[column_name], prefix='value', prefix_sep='_')
    col_names_dummies = dummies.columns.values

    #then you can append new columns to the dataframe
    for i,value in enumerate(col_names_dummies):
        data_transformed[value] = dummies.iloc[:,i]

এখানে ফলাফল data_transformed:

         dx1    dx2    dx3   dx4    dx5    dx6    dx7  value_25041  value_25061  0  25041  40391   5856     0  V4511  V5867  30000            1            0   
    1  25041  40391  25081  5856   5363   3572      0            1            0   
    2  25041  40391  42822     0   5856      0      0            1            0   
    3  25061  40391      0     0      0      0      0            0            1   
    4  25041  40391      0  5856  25081  V4511  25051            1            0   

      value_40391  value_0  value_5856  value_25081  value_42822  
    0            1        0           1            0            0  
    1            1        0           0            1            0  
    2            1        0           0            0            1  
    3            1        1           0            0            0  
    4            1        1           0            0            0  

এটি দেখতে ঠিক আছে তবে আপনি যদি মনোযোগ সহকারে দেখতে পান তবে আপনি দেখতে পাবেন যে মান ৮ এর জন্য এটির সমস্ত সারিতে 1 টি নেই। যেহেতু 0 সমস্ত সারিগুলিতে 0 উপস্থিত রয়েছে তাই মান_0 এর সমস্ত সারিতে 1 টি থাকা উচিত। মান_৫৫66, মান 50৫০৮১ ইত্যাদির জন্য একই It এটি মনে হয় যে এই যুক্তিটি একটি কলাম থেকে মানগুলি তুলছে এবং তারপরে আর ফিরে যাবে না পরিবর্তে এগিয়ে যাবে।
সানোজ

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

হ্যালো মাইকেলহেল্ড: আপনাকে ভোট দেওয়ার মত আমার কোনও ইচ্ছা ছিল না। আমি সবেমাত্র ক্লিক সাইনটি বন্ধ করে দিয়েছি কারণ এই সমাধানটি আমার জিজ্ঞাসা অনুসারে আমার চাহিদা পূরণ করে নি। প্রথমদিকে আমি ঠিক মনে করেছিলাম কিন্তু পরে যখন তদন্ত করেছিলাম তখন উপরের উত্তরে বর্ণিত ত্রুটিগুলি পেয়েছি। আমি এর কোনও উত্তর পাচ্ছিলাম না তাই আমি একটি নতুন প্রশ্ন তৈরি করেছি যেখানে আমি আমার মূল উত্তরটির উল্লেখ করেছি এবং আপনার উত্তরটি সংশোধন করার সাথে অন্তর্ভুক্ত করেছি। দুঃখিত আমি সেখানে আপনার নাম উল্লেখ করি নি। আমি এটি আপডেট করব।
সানোজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.