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


141

আমি একটি ডেটা ফ্রেমের এক কলামে মানগুলি প্রতিস্থাপনের চেষ্টা করছি। কলামে ('মহিলা') কেবল 'মহিলা' এবং 'পুরুষ' মান ধারণ করে।

আমি নিম্নলিখিত চেষ্টা করেছি:

w['female']['female']='1'
w['female']['male']='0' 

তবে আগের ফলাফলগুলির ঠিক একই অনুলিপিটি পান।

আমি আদর্শভাবে কিছু আউটপুট পেতে চাই যা নীচের লুপ উপাদান-অনুসারে সাদৃশ্যযুক্ত।

if w['female'] =='female':
    w['female'] = '1';
else:
    w['female'] = '0';

আমি গেটচাস ডকুমেন্টেশন দেখেছি ( http://pandas.pydata.org/pandas-docs/stable/gotchas.html ) তবে কেন কিছু হয় না তা বুঝতে পারি না।

যে কোন ধরণের সাহায্য গ্রহন করা হবে.

উত্তর:


259

আমি যদি সঠিকভাবে বুঝতে পারি তবে আপনি এই জাতীয় কিছু চান:

w['female'] = w['female'].map({'female': 1, 'male': 0})

(এখানে আমি সংখ্যার ধারণকারী স্ট্রিং পরিবর্তে নম্বরে মান রূপান্তর করুন। আপনি তাদেরকে রূপান্তর করতে পারেন "1"এবং "0", যদি আপনি সত্যিই চান, কিন্তু আমি নিশ্চিত আপনি যে কেন চাই চাই নই।)

কারণ আপনার কোড কাজ করে না কারণ ব্যবহার করছে ['female']একটি কলাম উপর (দ্বিতীয় 'female'আপনার w['female']['female']) না মানে "নির্বাচন করুন সারি যেখানে মান 'মহিলা' হল" না। এটা তোলে সারি যেখানে নির্বাচন মানে সূচক 'মহিলা' হল, যার মধ্যে সেখানে আপনার DataFrame কোনো নাও হতে পারে।


6
ধন্যবাদ। ঠিক আমি খুঁজছেন ছিল কি. আমি যদি 'মহিলা' কে 1 এবং অন্য কোনও কিছু '0' তে মানচিত্র করি। কিভাবে কাজ করবে?
কালো

17
এটি কেবলমাত্র ব্যবহার করুন, যদি কলামে সমস্ত মান মানচিত্র ফাংশনে দেওয়া হয় map মানচিত্র ফাংশনে নির্দিষ্ট না হওয়া কলাম মানগুলি ন্যান দ্বারা প্রতিস্থাপন করা হবে।
চন্দ্র

1
আমি .locএড়াতে সিনট্যাক্সটি ব্যবহার করার পরামর্শও দেবSettingWithCopyWarning : pandas.pydata.org/pandas-docs/stable/…
নিকব্রুনেজেল

2
.map এর পরিবর্তে আমি .replace ব্যবহার করেছি
JS

আমি কীভাবে মুক্তি পাব? ' দুই বা ততোধিক কলামে থাকা হাজার হাজারের মধ্যে এটি বের করা যায় না। আপনাকে অনেক ধন্যবাদ
এম মার্সিকাল

115

আপনি লোক ব্যবহার করে ডেটাফ্রেমের একটি উপসেট সম্পাদনা করতে পারেন:

df.loc[<row selection>, <column selection>]

এক্ষেত্রে:

w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1

1
আমি কীভাবে এটি মানিয়ে নেব যাতে শর্তের মাধ্যমে নির্দিষ্ট সারি নির্বাচন করার দরকার নেই, নির্দিষ্ট কলামে কেবল সমস্ত সারি? সুতরাং কলামের সমস্ত কক্ষকে একটি নির্দিষ্ট মানতে পরিবর্তন করুন।
ধ্রুব গুলতি

3
@ ধ্রুব গুলতি, আপনি df.loc ব্যবহার করবেন [:, <কলাম নির্বাচন>]




11

এছাড়াও আপনি ব্যবহার করতে পারেন applyসঙ্গে .getঅর্থাত

w['female'] = w['female'].apply({'male':0, 'female':1}.get):

w = pd.DataFrame({'female':['female','male','female']})
print(w)

ডেটাফ্রেম w:

   female
0  female
1    male
2  female

applyঅভিধান থেকে মানগুলি প্রতিস্থাপন করতে ব্যবহার করা হচ্ছে:

w['female'] = w['female'].apply({'male':0, 'female':1}.get)
print(w)

ফলাফল:

   female
0       1
1       0
2       1 

দ্রষ্টব্য: apply অভিধান সহ ডেটাফ্রেমের কলামগুলির সমস্ত সম্ভাব্য মান যদি অভিধানে সংজ্ঞায়িত করা হয় তবে অভিধানে এটি সংজ্ঞায়িত না হয়ে শূন্য থাকবে dictionary


8

এটি খুব কমপ্যাক্ট:

w['female'][w['female'] == 'female']=1
w['female'][w['female'] == 'male']=0

আরেকটি ভাল একটি:

w['female'] = w['female'].replace(regex='female', value=1)
w['female'] = w['female'].replace(regex='male', value=0)

প্রথম উদাহরণটি শৃঙ্খলাবদ্ধ শৃঙ্খলাবদ্ধ এবং এর বিরুদ্ধে সতর্ক করা হয়েছে কারণ এটি গ্যারান্টি দিতে পারে না যে ফলাফলিত ডিএফ একটি অনুলিপি বা ভিউ। দেখুন শৃঙ্খলিত-ইন্ডেক্স
Nordle

7

বিকল্পভাবে এই ধরণের অ্যাসাইনমেন্টের জন্য বিল্ট-ইন ফাংশন পিডি.গেট_ডিমি রয়েছে:

w['female'] = pd.get_dummies(w['female'],drop_first = True)

এটি আপনাকে দুটি কলাম সহ একটি ডেটা ফ্রেম দেয়, ডাব্লু ['মহিলা'] এ সংঘটিত প্রতিটি মানের জন্য একটি, যার মধ্যে আপনি প্রথমটি ড্রপ করেন (কারণ আপনি এটিটি বাকীটি থেকে সন্ধান করতে পারেন)। আপনার পরিবর্তিত স্ট্রিং হিসাবে নতুন কলামটি স্বয়ংক্রিয়ভাবে নামকরণ করা হয়েছে।

এটি বিশেষত কার্যকর যদি আপনার আরও দুটি সম্ভাব্য মান সহ শ্রেণীবদ্ধ ভেরিয়েবল থাকে। এই ফাংশনটি সমস্ত ক্ষেত্রে পার্থক্য করার জন্য প্রয়োজনীয় যতগুলি ডামি ভেরিয়েবল তৈরি করে। সতর্কতা অবলম্বন করুন যে আপনি কোনও একক কলামে পুরো ডেটা ফ্রেম বরাদ্দ না করেছেন, তবে পরিবর্তে, যদি [[মহিলা ']' পুরুষ ',' মহিলা 'বা' নিরপেক্ষ 'হতে পারে তবে এই জাতীয় কিছু করুন:

w = pd.concat([w, pd.get_dummies(w['female'], drop_first = True)], axis = 1])
w.drop('female', axis = 1, inplace = True)

তারপরে আপনার কাছে দুটি নতুন কলাম থাকবে যা আপনাকে 'মহিলা' এর ডামি কোডিং দেবে এবং আপনি স্ট্রিং সহ কলামটি থেকে মুক্তি পেয়ে যান।


4

সাথে ব্যবহার Series.mapকরাSeries.fillna

আপনার কলাম শুধুমাত্র চেয়ে বেশি স্ট্রিং থাকে femaleএবং male, Series.mapএই ক্ষেত্রে ব্যর্থ যেহেতু এটি ফিরে আসবে হবে NaNঅন্যান্য মানের জন্য।

এজন্য আমাদের এটির সাথে চেইন করতে হবে fillna:

.mapব্যর্থ হওয়ার উদাহরণ :

df = pd.DataFrame({'female':['male', 'female', 'female', 'male', 'other', 'other']})

   female
0    male
1  female
2  female
3    male
4   other
5   other
df['female'].map({'female': '1', 'male': '0'})

0      0
1      1
2      1
3      0
4    NaN
5    NaN
Name: female, dtype: object

জন্য সঠিক পদ্ধতি, আমরা চেইন mapসঙ্গে fillna, তাই আমরা পূরণ NaNমূল কলাম থেকে মান:

df['female'].map({'female': '1', 'male': '0'}).fillna(df['female'])

0        0
1        1
2        1
3        0
4    other
5    other
Name: female, dtype: object

2

pandasনামে পরিচিত একটি ফাংশন রয়েছে factorizeযা আপনি স্বয়ংক্রিয়ভাবে এই ধরণের কাজ করতে ব্যবহার করতে পারেন। এটা তোলে নম্বরে লেবেল পরিবর্তন করে: ['male', 'female', 'male'] -> [0, 1, 0]। আরও তথ্যের জন্য এই উত্তর দেখুন ।


0

আমি মনে করি যে উত্তরে পরামর্শ দেওয়া উচিত যে আপনি উপরে প্রস্তাবিত সমস্ত পদ্ধতিতে কোন ধরণের অবজেক্টটি পান: এটি সিরিজ বা ডেটাফ্রেম।

যখন আপনি কলামটি পাবেন w.female.বা w[[2]](যেখানে, ধরুন, 2 আপনার কলামের সংখ্যা) আপনি ডেটাফ্রেম ফিরে পাবেন। সুতরাং এক্ষেত্রে আপনি ডাটাফ্রেম পদ্ধতিগুলি ব্যবহার করতে পারেন.replace

আপনি ব্যবহার করেন, তখন .locবা ilocতুমি ফিরে সিরিজ পেতে, এবং সিরিজ হবে না .replaceপদ্ধতি, তাই আপনার মত পদ্ধতি ব্যবহার করা উচিত apply, mapইত্যাদি।

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