একটি নতুন পান্ডাস কলাম তৈরি করতে একাধিক যুক্তি সহ ফাংশন প্রয়োগ করা


165

আমি pandasদুটি বিদ্যমান কলামে একটি ফাংশন প্রয়োগ করে একটি ডেটা ফ্রেমে একটি নতুন কলাম তৈরি করতে চাই । এই উত্তরের অনুসরণ করে আমি যখন একটি যুক্তি হিসাবে কেবল একটি কলাম প্রয়োজন তখন আমি একটি নতুন কলাম তৈরি করতে সক্ষম হয়েছি:

import pandas as pd
df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})

def fx(x):
    return x * x

print(df)
df['newcolumn'] = df.A.apply(fx)
print(df)

যাইহোক, যখন ফাংশনটিতে একাধিক যুক্তি প্রয়োজন তখন একই জিনিসটি কীভাবে করব তা আমি বুঝতে পারি না। উদাহরণস্বরূপ, নীচের ফাংশনে কলাম ক এবং কলাম বি পাশ করে আমি কীভাবে একটি নতুন কলাম তৈরি করব?

def fxy(x, y):
    return x * y

উত্তর:


136

বিকল্পভাবে, আপনি নির্লজ্জ অন্তর্নিহিত ফাংশন ব্যবহার করতে পারেন:

>>> import numpy as np
>>> df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
>>> df['new_column'] = np.multiply(df['A'], df['B'])
>>> df
    A   B  new_column
0  10  20         200
1  20  30         600
2  30  10         300

বা সাধারণ ক্ষেত্রে স্বেচ্ছাসেবক কার্য ভেক্টরাইজ:

>>> def fx(x, y):
...     return x*y
...
>>> df['new_column'] = np.vectorize(fx)(df['A'], df['B'])
>>> df
    A   B  new_column
0  10  20         200
1  20  30         600
2  30  10         300

2
উত্তর করার জন্য ধন্যবাদ! আমি কৌতূহলী, এটি কি দ্রুততম সমাধান?
এমভি 23

6
ভেক্টরাইজড সংস্করণ ব্যবহার করে np.vectorize()আশ্চর্যরকম দ্রুত। ধন্যবাদ.
stackoverflowuser2010

এটি একটি দরকারী সমাধান। এক্স এবং y ফাংশনে ইনপুট আর্গুমেন্টগুলির আকার সমান না হলে আপনি একটি ত্রুটি পান। সেক্ষেত্রে @ রোমানপেকার সমাধান কোনও সমস্যা ছাড়াই কাজ করে। আমি পারফরম্যান্স তুলনা করি না।
এহসান সদর

আমি জানি এটি একটি পুরানো উত্তর, তবে: আমার একটি প্রান্তের মামলা রয়েছে, এতে np.vectorizeকাজ হয় না। কারণটি হ'ল, কলামগুলির মধ্যে একটি প্রকারের pandas._libs.tslibs.timestamps.Timestamp, যা numpy.datetime64ভেক্টরাইজেশন দ্বারা প্রকারে রূপান্তরিত হয় । দুটি প্রকারের বিনিময়যোগ্য নয়, ফলে ফাংশনটি খারাপ আচরণ করে। এ সম্পর্কে কোন পরামর্শ? (এটি .applyহিসাবে স্পষ্টতই এড়ানো এড়ানো ছাড়া)
এলরুডি

দুর্দান্ত সমাধান! যদি কেউ ভাবছেন যে ভেক্টরাইজ স্ট্রিং তুলনা ফাংশনগুলির জন্য ভাল এবং সুপার দ্রুত কাজ করে।
infiniteloop

227

আপনি @ গ্রিনআফ্রিকান উদাহরণ দিয়ে যেতে পারেন, যদি আপনার ফাংশনটি পুনরায় লেখার পক্ষে সম্ভব হয়। তবে আপনি যদি নিজের ফাংশনটি নতুন করে লিখতে না চান তবে আপনি এটিকে প্রয়োগের ভিতরে বেনামে ফাংশনটিতে গুটিয়ে রাখতে পারেন:

>>> def fxy(x, y):
...     return x * y

>>> df['newcolumn'] = df.apply(lambda x: fxy(x['A'], x['B']), axis=1)
>>> df
    A   B  newcolumn
0  10  20        200
1  20  30        600
2  30  10        300

4
এটি দুর্দান্ত টিপ, এবং এটি প্রয়োগ কল (এটিতে প্রকৃতপক্ষে) এর নিকটে কলামের উল্লেখগুলি ছেড়ে দেয় leaves আমি এই টিপটি ব্যবহার করেছি এবং মাল্টি-কলাম আউটপুট টিপটি @ টোটো_টিকো সরবরাহ করে একটি 3 কলাম ইন, 4 কলাম আউট ফাংশন তৈরি করতে! দুর্দান্ত কাজ!
রুফাসভিএস

7
বাহ, মনে হচ্ছে আপনিই কেবলমাত্র ওপি-র ন্যূনতম উদাহরণের দিকে মনোনিবেশ করছেন না তবে পুরো সমস্যাটির সমাধান করেছেন, ধন্যবাদ, আমার ঠিক যা প্রয়োজন! :)
ম্যাট

38

এটি সমস্যার সমাধান করে:

df['newcolumn'] = df.A * df.B

আপনি এছাড়াও করতে পারেন:

def fab(row):
  return row['A'] * row['B']

df['newcolumn'] = df.apply(fab, axis=1)

10
এই উত্তরটি এই খেলনা উদাহরণটি সমাধান করে এবং আমার আসল ফাংশনটি পুনরায় লেখার জন্য আমার পক্ষে যথেষ্ট হবে, তবে এটি পূর্বে সংজ্ঞায়িত ফাংশনটি কীভাবে রেফারেন্স কলামগুলিতে পুনরায় লিখিত না করে প্রয়োগ করতে হবে তা সম্বোধন করে না।
মাইকেল

23

আপনার যদি একবারে একাধিক কলাম তৈরি করতে হয় :

  1. ডেটাফ্রেম তৈরি করুন:

    import pandas as pd
    df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
  2. ফাংশন তৈরি করুন:

    def fab(row):                                                  
        return row['A'] * row['B'], row['A'] + row['B']
  3. নতুন কলামগুলি বরাদ্দ করুন:

    df['newcolumn'], df['newcolumn2'] = zip(*df.apply(fab, axis=1))

1
আমি ভাবছিলাম কীভাবে আমি একটি প্রয়োগ সহ একাধিক কলাম তৈরি করতে পারি! আমি এটি @ রোমন পেকারের উত্তর দিয়ে একটি 3 কলাম ইন, 4 কলাম আউট ফাংশন তৈরি করতে ব্যবহার করেছি! দুর্দান্ত কাজ!
রুফাসভিএস

15

আরও একটি ডিক স্টাইল ক্লিন সিনট্যাক্স:

df["new_column"] = df.apply(lambda x: x["A"] * x["B"], axis = 1)

বা,

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