পাইথন পান্ডাস: একটি সিরিজে যুক্তি সহ একটি ফাংশন প্রয়োগ করুন


147

আমি পাইথন পান্ডাসে একটি সিরিজে যুক্তি যুক্ত একটি ফাংশন প্রয়োগ করতে চাই:

x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...

ডকুমেন্টেশন একটি পদ্ধতি প্রয়োগ করার জন্য সহায়তা বর্ণনা করে, কিন্তু এটি কোনো আর্গুমেন্ট গ্রহণ করে না। যুক্তিগুলি গ্রহণ করার কোনও আলাদা পদ্ধতি আছে কি? বিকল্পভাবে, আমি কি একটি সাধারণ কাজটি মিস করছি?

আপডেট (অক্টোবর 2017): নোট করুন যেহেতু এই প্রশ্নটি মূলত জিজ্ঞাসা করা হয়েছিল যে apply()অবস্থান ও মূলশব্দ যুক্তিগুলি পরিচালনা করতে প্যান্ডাস আপডেট করা হয়েছে এবং উপরের ডকুমেন্টেশন লিঙ্কটি এখন এটি প্রতিফলিত করে এবং দেখায় যে উভয় প্রকারের যুক্তি কীভাবে অন্তর্ভুক্ত করা যায়।


3
কেন শুধু ব্যবহার করবেন না functools.partial, বা starmap?
জোয়েল করনেট

উত্তর:


170

পান্ডাস -এর একটি নবীনতর সংস্করণ না আপনি অতিরিক্ত আর্গুমেন্ট (দেখুন পাস করার অনুমতি দেয় নতুন ডকুমেন্টেশন )। সুতরাং এখন আপনি এটি করতে পারেন:

my_series.apply(your_function, args=(2,3,4), extra_kw=1)

সিরিজের উপাদানটির পরে অবস্থানগত যুক্তি যুক্ত করা হয়।


পান্ডার পুরানো সংস্করণের জন্য:

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

একটি উদাহরণ:

>>> import functools
>>> import operator
>>> add_3 = functools.partial(operator.add,3)
>>> add_3(2)
5
>>> add_3(7)
10

আপনি কীওয়ার্ড আর্গুমেন্টগুলি ব্যবহার করে পাসও করতে পারেন partial

আরেকটি উপায় হ'ল ল্যাম্বদা তৈরি করা:

my_series.apply((lambda x: your_func(a,b,c,d,...,x)))

তবে আমি মনে করি ব্যবহার partialকরা আরও ভাল।


12
ডেটাফ্রেমের জন্য প্রয়োগের পদ্ধতিটি argsআর্গুমেন্ট গ্রহণ করে, যা নামযুক্তগুলির জন্য অতিরিক্ত অবস্থানগত আর্গুমেন্ট বা ** কেডব্লিউড ধারণকারী একটি টুপল। আমি সিরিজ.এপ্লাইয়ের জন্য এটি তৈরি করার জন্য একটি সমস্যা তৈরি করেছি () github.com/pydata/pandas/issues/1829
ওয়াউটার ওভারমায়ার

28
বৈশিষ্ট্যটি কার্যকর করা হয়েছে, আসন্ন পান্ডাস রিলিজে আসবে
ওয়েস ম্যাককেনি

4
এটি একটি দুর্দান্ত উত্তর তবে এর প্রথম 2/3 টি এখন সত্যিই অপ্রচলিত। আইএমও, নতুন ডকুমেন্টেশনের লিঙ্ক হয়ে অবস্থান এবং / অথবা কীওয়ার্ড আরগগুলির সাথে কীভাবে ব্যবহার করা যায় তার সংক্ষিপ্ত উদাহরণ হয়ে এই উত্তরটি সুন্দরভাবে আপডেট করা যেতে পারে। কেবল FWIW এবং মূল উত্তরের সমালোচনা নয়, কেবলমাত্র একটি আপডেট আইএমও থেকে উপকৃত হবে, বিশেষত এটি প্রায়শই পড়ার উত্তর।
জন

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

দ্রষ্টব্য: আপনি যদি একটি একক স্ট্রিং আর্গুমেন্টটি পাস করেন, উদাহরণস্বরূপ 'abc', তবে args=('abc')তিনটি আর্গুমেন্ট হিসাবে মূল্যায়ন করা হবে ('a', 'b', 'c')। এটি এড়াতে, আপনাকে স্ট্রিং সমেত একটি টুপল পাস করতে হবে এবং এটি করতে একটি পিছনের কমা অন্তর্ভুক্ত করতে হবে:args=('abc',)
রকি কে

82

পদক্ষেপ:

  1. একটি ডেটা ফ্রেম তৈরি করুন
  2. একটি ফাংশন তৈরি করুন
  3. প্রয়োগের বিবৃতিতে ফাংশনের নাম যুক্তি ব্যবহার করুন।

উদাহরণ

x=pd.DataFrame([1,2,3,4])  

def add(i1, i2):  
    return i1+i2

x.apply(add,i2=9)

এই উদাহরণের ফলাফলটি হ'ল ডেটা ফ্রেমের প্রতিটি নম্বর 9 নম্বরে যুক্ত করা হবে।

    0
0  10
1  11
2  12
3  13

ব্যাখ্যা:

"যোগ" ফাংশনটির দুটি পরামিতি রয়েছে: i1, i2। প্রথম প্যারামিটারটি ডাটা ফ্রেমে মান হতে চলেছে এবং দ্বিতীয়টি আমরা "প্রয়োগ" ফাংশনে যা যা পাস তা হ'ল। এই ক্ষেত্রে, আমরা কীওয়ার্ড আর্গুমেন্ট "i2" ব্যবহার করে প্রয়োগ ফাংশনে "9" পাশ করছি।


2
ঠিক আমি খুঁজছেন ছিল কি. উল্লেখযোগ্যভাবে, কেবল একটি সিরিজ (বা ডিএফ) পরিচালনা করার জন্য এটির জন্য একটি কাস্টম ফাংশন তৈরি করার দরকার নেই। পারফেক্ট!
কনার

কেবলমাত্র অবশিষ্ট প্রশ্নটি হল: কীভাবে কীওয়ার্ড আর্গুমেন্টটিকে প্রথম যুক্তিতে যুক্ত করতে হবে (i1) এবং i2 দিয়ে পুনরাবৃত্তি করতে হবে?
কনার

আমি মনে করি এটি সেরা উত্তর
ক্রিপডিক

43
Series.apply(func, convert_dtype=True, args=(), **kwds)

args : tuple

x = my_series.apply(my_function, args = (arg1,))

11
ধন্যবাদ! আপনি কি ব্যাখ্যা করতে পারেন যে প্রথম আর্গুমেন্টের পরে আরগস = (আরগ 1,) কমা প্রয়োজন কেন?
ডাঃমিশা

21
@ মিশা টেপলিটস্কি, পাইথনের জন্য প্রথম বন্ধনীগুলির বিষয়বস্তুগুলি দৈর্ঘ্যের 1 টি হতে হবে বোঝার জন্য আপনার কমা প্রয়োজন
need

3
কি জন্য আর্গ স্থাপন করা সম্পর্কে func। সুতরাং আমি যদি আবেদন করতে চাই তবে আমি pd.Series.mean(axis=1)কীভাবে এটিতে রাখি axis=1?
লিটল ববি টেবিলগুলি

1
পার্শ্ব নোট হিসাবে, আপনি <args> প্যারামিটার ব্যবহার না করে একটি কীওয়ার্ড যুক্তি যুক্ত করতে পারেন (যেমন: x = my_series.apply (my_function, কীওয়ার্ড_আরগ = আরগ 1)), যেখানে <keyword_arg> আমার_ফাঁসের ইনপুট প্যারামিটারগুলির মধ্যে রয়েছে)
লেভ

1
এই প্রতিক্রিয়াটি খুব সংক্ষিপ্ত এবং কোনও ব্যাখ্যা দেয় না
FistOfFury

23

আপনি যে applyফাংশনটিতে নামহীন তর্কগুলি argsপ্যারামিটারে টিপল হিসাবে প্রেরণ করা হয়েছে বা kwdsপ্যারামিটার দ্বারা একটি অভিধান হিসাবে অভ্যন্তরীণভাবে আটকানো অন্যান্য কীওয়ার্ড আর্গুমেন্টগুলির মাধ্যমে কল করে এমন ফাংশনে আপনি কয়েকটি সংখ্যক আর্গুমেন্ট পাস করতে পারেন ।

উদাহরণস্বরূপ, আসুন একটি ফাংশন তৈরি করি যা 3 থেকে 6 এর মধ্যে মানের জন্য সত্য এবং অন্যথায় মিথ্যা দেয়।

s = pd.Series(np.random.randint(0,10, 10))
s

0    5
1    3
2    1
3    1
4    6
5    0
6    3
7    4
8    9
9    6
dtype: int64

s.apply(lambda x: x >= 3 and x <= 6)

0     True
1     True
2    False
3    False
4     True
5    False
6     True
7     True
8    False
9     True
dtype: bool

এই বেনামে ফাংশনটি খুব নমনীয় নয়। আমাদের সিরিজে আমরা চাই ন্যূনতম এবং সর্বাধিক মানগুলি নিয়ন্ত্রণ করতে দুটি যুক্তি সহ একটি সাধারণ ফাংশন তৈরি করি create

def between(x, low, high):
    return x >= low and x =< high

নামবিহীন আর্গুমেন্টগুলিকে এখানে পাঠিয়ে আমরা প্রথম ফাংশনের আউটপুট প্রতিলিপি করতে পারি args:

s.apply(between, args=(3,6))

অথবা আমরা নাম যুক্তি ব্যবহার করতে পারেন

s.apply(between, low=3, high=6)

অথবা উভয়ের সংমিশ্রণও

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