আমার একটি দৃশ্য রয়েছে যেখানে কোনও ব্যবহারকারী পান্ডস ডেটাফ্রেম বা সিরিজ অবজেক্টে বেশ কয়েকটি ফিল্টার প্রয়োগ করতে চায়। মূলত, আমি দক্ষতার সাথে গুচ্ছ ফিল্টারিং (তুলনা অপারেশন) একসাথে করতে চাই যা ব্যবহারকারীর দ্বারা রান-টাইমে নির্দিষ্ট করা আছে।
ফিল্টারগুলি অ্যাডিটিভ হওয়া উচিত (ওরফে প্রতিটি প্রয়োগ করা উচিত সঙ্কুচিত ফলাফল)।
আমি বর্তমানে ব্যবহার করছি reindex()
তবে এটি প্রতিবার একটি নতুন অবজেক্ট তৈরি করে এবং অন্তর্নিহিত ডেটা অনুলিপি করে (যদি আমি ডকুমেন্টেশন সঠিকভাবে বুঝতে পারি)। সুতরাং, বড় সিরিজ বা ডেটাফ্রেম ফিল্টার করার সময় এটি সত্যিই অদক্ষ হতে পারে।
আমি ভাবছি যে ব্যবহার করা apply()
, map()
বা অনুরূপ কিছু ভাল হতে পারে। আমি পান্ডাদের কাছে বেশ নতুন যদিও তবুও সমস্ত কিছু আমার মাথা জড়িয়ে দেওয়ার চেষ্টা করে trying
টি এল; ডিআর
আমি নিম্নলিখিত ফর্মের একটি অভিধান নিতে এবং প্রদত্ত সিরিজ অবজেক্টে প্রতিটি ক্রিয়াকলাপ প্রয়োগ করতে এবং একটি 'ফিল্টারড' সিরিজ অবজেক্টটি ফিরিয়ে দিতে চাই।
relops = {'>=': [1], '<=': [1]}
দীর্ঘ উদাহরণ
আমি বর্তমানে আমার কাছে যা আছে তার একটি উদাহরণ দিয়ে শুরু করব এবং কেবল একটি একক সিরিজ অবজেক্ট ফিল্টার করব। নীচে ফাংশনটি বর্তমানে আমি ব্যবহার করছি:
def apply_relops(series, relops):
"""
Pass dictionary of relational operators to perform on given series object
"""
for op, vals in relops.iteritems():
op_func = ops[op]
for val in vals:
filtered = op_func(series, val)
series = series.reindex(series[filtered])
return series
ব্যবহারকারীরা যে ক্রিয়াকলাপ সম্পাদন করতে চান তার সাথে একটি অভিধান সরবরাহ করে:
>>> df = pandas.DataFrame({'col1': [0, 1, 2], 'col2': [10, 11, 12]})
>>> print df
>>> print df
col1 col2
0 0 10
1 1 11
2 2 12
>>> from operator import le, ge
>>> ops ={'>=': ge, '<=': le}
>>> apply_relops(df['col1'], {'>=': [1]})
col1
1 1
2 2
Name: col1
>>> apply_relops(df['col1'], relops = {'>=': [1], '<=': [1]})
col1
1 1
Name: col1
আবার, আমার উপরোক্ত পদ্ধতির সাথে 'সমস্যা' হ'ল আমি মনে করি অভ্যন্তরীণ পদক্ষেপগুলির জন্য ডেটা অনুলিপি করার অনর্থক প্রচুর পরিমাণ রয়েছে।
এছাড়াও, আমি এটি প্রসারিত করতে চাই যাতে পাস করা অভিধানটিতে কলামগুলি অপারেটরে অন্তর্ভুক্ত করা যায় এবং ইনপুট অভিধানের ভিত্তিতে একটি সম্পূর্ণ ডেটা ফ্রেম ফিল্টার করতে পারে। তবে আমি ধরে নিচ্ছি যে সিরিজের জন্য যা কিছু কাজ করে তা সহজেই ডেটাফ্রেমে প্রসারিত করা যায়।
df.query
এবং pd.eval
আপনার ব্যবহারের ক্ষেত্রে ভাল মানায়। তথ্যের জন্য pd.eval()
ফাংশন, তাদের বৈশিষ্ট্য ও ব্যবহারের ক্ষেত্রে পরিবার, অনুগ্রহ করে পরিদর্শন pd.eval ব্যবহার পান্ডাস মধ্যে ডায়নামিক এক্সপ্রেশন মূল্যায়ন () ।