যদি-এলিফ-অন্য শর্তের ভিত্তিতে একটি নতুন কলাম তৈরি করা হচ্ছে


100

আমার একটি ডেটা ফ্রেম রয়েছে df:

    A    B
a   2    2 
b   3    1
c   1    3

আমি নিম্নলিখিত মানদণ্ডের উপর ভিত্তি করে একটি নতুন কলাম তৈরি করতে চাই:

সারি যদি A == B: 0

সারি যদিA > B: 1

সারি যদি A < B: -1

উপরের টেবিলটি দেওয়া আছে, এটি হওয়া উচিত:

    A    B    C
a   2    2    0
b   3    1    1
c   1    3   -1 

আমি যে সাধারণ if elseক্ষেত্রে করি np.where(df.A > df.B, 1, -1), তার জন্য কী পান্ডগুলি এক ধাপের (3 টি নতুন কলাম তৈরি করার প্রয়োজনীয়তা ছাড়াই এবং ফলাফলের সংমিশ্রণ ছাড়াই) আমার সমস্যা সমাধানের জন্য একটি বিশেষ বাক্য গঠন সরবরাহ করে?


আপনি কেবল একটি ফাংশন সংজ্ঞায়িত করতে পারেন applyএবং axis=1
এটিতে

আপনার সমাধানটি বোঝায় যে 3 টি কলাম তৈরি করা এবং তাদের 1 টি কলামে সংমিশ্রণ করা, বা আপনার মনে কিছু আলাদা আছে?
নিটশিপ

আপনি "3 টি কলাম তৈরি করা" বলছেন, তবে আপনি কী উল্লেখ করছেন তা আমি নিশ্চিত নই।
ডিএসএম

4
@ ডিএসএম এই প্রশ্নের উত্তর দিয়েছে তবে আমার অর্থ এমন ছিল df['C']=df.apply(myFunc(row), axis=1)যেখানে আমার ফানক আপনি যা চান সেখানে এটি '3 কলাম' তৈরি করতে জড়িত না
এডচাম

উত্তর:


146

উপরে বর্ণিত কিছু পদ্ধতির আনুষ্ঠানিকভাবে:

এমন একটি ফাংশন তৈরি করুন যা আপনার ডেটাফ্রেমের সারিগুলিতে কাজ করে:

def f(row):
    if row['A'] == row['B']:
        val = 0
    elif row['A'] > row['B']:
        val = 1
    else:
        val = -1
    return val

তারপরে বিকল্পটিতে পাস করা আপনার ডেটাফ্রেমে এটি প্রয়োগ করুন axis=1:

In [1]: df['C'] = df.apply(f, axis=1)

In [2]: df
Out[2]:
   A  B  C
a  2  2  0
b  3  1  1
c  1  3 -1

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

সম্পাদনা করুন

এখানে ভেক্টরাইজড সংস্করণ

df['C'] = np.where(
    df['A'] == df['B'], 0, np.where(
    df['A'] >  df['B'], 1, -1)) 

4
ধন্যবাদ, আমি পান্ডা দিয়ে শুরু করছি এবং এটি খুব সাহায্যকারী +1
সংক্ষেপে

4
যদি আমি ফাংশনে সারি সহ অন্য একটি প্যারামিটারটি পাস করতে চাই তবে কী হবে? যদি আমি এটি করি তবে এটি সারিটি সংজ্ঞায়িত নয় বলে উল্লেখ করেছে ..
প্রশান্ত মনোহর

4
আপনাকে ফাংশনের argsপ্যারামিটারটি ব্যবহার করতে হবে .apply: pandas.pydata.org/pandas-docs/stable/generated/…
Zelazny7

4
আমি পাইথন শেখার একজন পুরানো এসএএস ব্যবহারকারী, এবং অবশ্যই একটি শেখার বক্ররেখা আছে! :-) উদাহরণস্বরূপ, উপরের কোডটি এসএএস-তে লেখা যেতে পারে: data df; set df; if A=B then C=0; else if A>B then C=1; else C=-1; run;খুব মার্জিত এবং সহজ।
রবার্টএফ

4
একটি সংজ্ঞায়িত উত্তর
সাহিল নাগপাল

51
df.loc[df['A'] == df['B'], 'C'] = 0
df.loc[df['A'] > df['B'], 'C'] = 1
df.loc[df['A'] < df['B'], 'C'] = -1

সূচক ব্যবহার করে সমাধান করা সহজ। কোডের প্রথম লাইনটি এর মতো পড়ে, কলামটি যদি কলামের Aসমান হয় Bতবে কলামটি C0 এর সমান করুন এবং সেট করুন ।


17

এই বিশেষ সম্পর্কের জন্য, আপনি ব্যবহার করতে পারেন np.sign:

>>> df["C"] = np.sign(df.A - df.B)
>>> df
   A  B  C
a  2  2  0
b  3  1  1
c  1  3 -1

6

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

উপরের একটিকে আপনার মূল ডেটাফ্রেম হিসাবে বলা যাক এবং আপনি একটি নতুন কলাম 'পুরানো' যুক্ত করতে চান

যদি বয়স 50 এর বেশি হয় তবে আমরা বয়স্ক হিসাবে বিবেচনা করি = হ্যাঁ অন্যথায় মিথ্যা

পদক্ষেপ 1: সারিগুলির সূচিপত্রগুলি পান যার বয়স 50

row_indexes=df[df['age']>=50].index

ধাপ 2-এর বেশি হয় : .loc ব্যবহার করে আমরা কলামে একটি নতুন মান নির্ধারণ করতে পারি

df.loc[row_indexes,'elderly']="yes"

50 বছরের কম বয়সীদের জন্য সমান

row_indexes=df[df['age']<50].index

df[row_indexes,'elderly']="no"

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