শর্তসাপেক্ষে পান্ডাস প্রতিস্থাপন করুন


123

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

df[df.my_channel > 20000].my_channel = 0

আমি যদি চ্যানেলটিকে কোনও নতুন ডেটা ফ্রেমে অনুলিপি করি তবে এটি সহজ:

df2 = df.my_channel 

df2[df2 > 20000] = 0

এটি আমি যা চাই ঠিক তা করে তবে মূল ডেটাফ্রেমের অংশ হিসাবে চ্যানেলের সাথে কাজ করছে না বলে মনে হয়।


আপনি এখানে যা খুঁজছিলেন তা আমি পেয়েছি ।
পাদদেশে

উত্তর:


181

.ixসূচক ০.২০.০ এর পূর্বে পান্ডাস সংস্করণে ঠিক আছে, তবে পান্ডাস ০.২০.০ থেকে .ixসূচকের অবমূল্যায়ন করা হয়েছে , সুতরাং আপনার এটি ব্যবহার করা এড়ানো উচিত। পরিবর্তে, আপনি ব্যবহার করতে পারেন .locবা ilocসূচকগুলি। আপনি এই সমস্যাটি এর মাধ্যমে সমাধান করতে পারেন:

mask = df.my_channel > 20000
column_name = 'my_channel'
df.loc[mask, column_name] = 0

বা, এক লাইনে,

df.loc[df.my_channel > 20000, 'my_channel'] = 0

maskসারি যা নির্বাচন করতে আপনাকে সাহায্য করে df.my_channel > 20000হয় True, যখন df.loc[mask, column_name] = 0নির্বাচিত সারিতে সেট মান 0 যেখানে maskকলাম নাম যা ঝুলিতে column_name

আপডেট: এই ক্ষেত্রে, আপনার ব্যবহার করা উচিত locকারণ আপনি যদি এটি ব্যবহার করেন তবে আপনি ilocআপনাকে একটি NotImplementedErrorবলবেন যে কোনও পূর্ণসংখ্যার ধরণের আইলোকেশন ভিত্তিক বুলিয়ান ইনডেক্সিং উপলভ্য নয়


81

চেষ্টা

df.loc[df.my_channel > 20000, 'my_channel'] = 0

দ্রষ্টব্য: v0.20.0 থেকে, / এর পক্ষে ix অবচিত করা হয়েছেlociloc


8
ধন্যবাদ. আমি আমার নিজস্ব সমাধানও পেয়েছি, যা ছিল: df.my_channel [df.my_channel> 20000] = 0
বিএমচেল ll

2
@ বি মিচেল আমি মনে করি আপনার সমাধানটি আপনাকে 0.13 এ সতর্কবার্তা দেওয়া শুরু করতে পারে, এখনও চেষ্টা করার সুযোগ হয়নি
লোয়েটেক

উত্পাদনের ত্রুটি: /opt/anaconda3/envs/python35/lib/python3.5/site-packages/ipykernel_launcher.py split: সেটিং উইথকপি ওয়ার্নিং: একটি ডেটা ফ্রেমে একটি স্লাইসের অনুলিপিটিতে সেট করার চেষ্টা করা হচ্ছে ক্যাভেটস দেখুন ডকুমেন্টেশন: pandas.pydata.org/pandas-docs/stable/… "" " আইপিথন কার্নেল প্রবর্তনের জন্য প্রবেশের পয়েন্ট
রাটার হাফস্টে

@ রুটারহফস্টে উল্লেখ করার জন্য ধন্যবাদ, অন্য আর একটি যুক্তি কখনও পাইথন 3 ব্যবহার করে না
লোটেক

34

np.where ফাংশন নিম্নলিখিত হিসাবে কাজ করে:

df['X'] = np.where(df['Y']>=50, 'yes', 'no')

আপনার ক্ষেত্রে আপনি চান:

import numpy as np
df['my_channel'] = np.where(df.my_channel > 20000, 0, df.my_channel)

19

আপনার আসল ডেটাফ্রেমটি আপডেট না হওয়ার কারণ হ'ল শৃঙ্খলযুক্ত ইনডেক্সিং আপনার ডেটাফ্রেমের ভিউয়ের পরিবর্তে একটি অনুলিপি পরিবর্তন করতে পারে। ডক্স এই উপদেশ দিতে:

পান্ডাস অবজেক্টে মান নির্ধারণের সময়, চেইনড ইনডেক্সিং যাকে বলা হয় তা এড়াতে যত্ন নেওয়া উচিত।

আপনার কয়েকটি বিকল্প রয়েছে: -

loc + বুলিয়ান ইনডেক্সিং

loc মানগুলি সেট করার জন্য এবং বুলিয়ান মাস্কগুলিকে সমর্থন করার জন্য ব্যবহার করা যেতে পারে:

df.loc[df['my_channel'] > 20000, 'my_channel'] = 0

mask + বুলিয়ান ইনডেক্সিং

আপনি আপনার সিরিজ বরাদ্দ করতে পারেন:

df['my_channel'] = df['my_channel'].mask(df['my_channel'] > 20000, 0)

অথবা আপনি নিজের সিরিজটি আপডেট করতে পারেন:

df['my_channel'].mask(df['my_channel'] > 20000, 0, inplace=True)

np.where + বুলিয়ান ইনডেক্সিং

আপনি করতে পারেন আপনার মূল সিরিজ যখন আপনার অবস্থা বরাদ্দ করে NumPy ব্যবহার না সন্তুষ্ট; তবে, প্রথম দুটি সমাধান পরিষ্কার হয় যেহেতু তারা স্পষ্টভাবে কেবলমাত্র নির্দিষ্ট মানগুলি পরিবর্তন করে।

df['my_channel'] = np.where(df['my_channel'] > 20000, 0, df['my_channel'])

0

আমি ব্যবহার করেন lambdaএকটি উপর ফাংশন Seriesএকটি এর DataFrameভালো:

f = lambda x: 0 if x>100 else 1
df['my_column'] = df['my_column'].map(f)

আমি জোর দিয়ে বলছি না যে এটি একটি দক্ষ উপায়, তবে এটি দুর্দান্ত কাজ করে।


3
এটি অকার্যকর এবং প্রস্তাবিত নয় কারণ এটি একটি সারিবদ্ধ ক্রিয়াকলাপে পাইথন-স্তরের লুপ জড়িত।
জেপিপি

আপনাকে ধন্যবাদ, আমি অনুমান করি আমরা locএখানে যেমন ব্যবহার করতে পারি df.loc[: , 'my_column'] = df['my_column'].map(f)। আপনারা নীচে যেগুলি যুক্ত করেছেন তা এটি দ্রুত কিনা তা আমি জানি না।
ওজকান সার্টাস

2
নাহ, আপনি কলাম-ওয়াইসের পরিবর্তে সারি অনুসারে অপারেটিং চালিয়ে যাওয়ায় এখনও ধীর গতির।
জেপ্পি

0

এটা চেষ্টা কর:

df.my_channel = df.my_channel.where(df.my_channel <= 20000, other= 0)

অথবা

df.my_channel = df.my_channel.mask(df.my_channel > 20000, other= 0)

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