আপনি একাধিক কলাম দ্বারা পান্ডাস ডেটা ফ্রেমগুলি কীভাবে ফিল্টার করবেন


103

একটি একক কলাম দ্বারা ডেটাফ্রেম (ডিএফ) ফিল্টার করতে, যদি আমরা পুরুষ এবং স্ত্রীলোকদের সাথে ডেটা বিবেচনা করি তবে:

males = df[df[Gender]=='Male']

প্রশ্ন 1 - তবে যদি ডেটাটি একাধিক বছর বিস্তৃত হয় এবং আমি কেবল 2014 এর জন্য পুরুষ দেখতে চাই?

অন্যান্য ভাষায় আমি এর মতো কিছু করতে পারি:

if A = "Male" and if B = "2014" then 

(আমি এটি করতে চাই এবং একটি নতুন ডেটাফ্রেম অবজেক্টে মূল ডেটাফ্রেমের একটি উপসেট পেতে চাই)

প্রশ্ন ২. আমি কীভাবে এটি লুপে করব এবং বছরের এবং লিঙ্গের প্রতিটি অনন্য সেট (যেমন একটি ডিএফ: 2013-পুরুষ, 2013-মহিলা, 2014-পুরুষ এবং 2014-মহিলার জন্য ডেটাফ্রেম অবজেক্ট তৈরি করব)

for y in year:

for g in gender:

df = .....

আপনি কি এটি ফিল্টার করতে চান বা এটি গ্রুপ করতে চান ? যদি আপনি বছরের এবং লিঙ্গের প্রতিটি অনন্য সেটের জন্য একটি পৃথক ডেটাফ্রেম তৈরি করতে চান তবে দেখুন groupby
ব্রেণবার্ন

4
এই উত্তরটি পান্ডাসে বুলিয়ান ইনডেক্সিং এবং লজিকাল অপারেটরগুলির একটি বিস্তৃত ওভারভিউ দেয়।
CS95

উত্তর:


183

&অপারেটরটি ব্যবহার করে , সাব-স্টেটমেন্টগুলি এগুলি মুছতে ভুলবেন না ():

males = df[(df[Gender]=='Male') & (df[Year]==2014)]

dictলুপের জন্য একটি ব্যবহার করে আপনার ডেটাফ্রেমগুলি সঞ্চয় করতে :

from collections import defaultdict
dic={}
for g in ['male', 'female']:
  dic[g]=defaultdict(dict)
  for y in [2013, 2014]:
    dic[g][y]=df[(df[Gender]==g) & (df[Year]==y)] #store the DataFrames to a dict of dict

সম্পাদনা:

আপনার জন্য একটি ডেমো getDF:

def getDF(dic, gender, year):
  return dic[gender][year]

print genDF(dic, 'male', 2014)

দুর্দান্ত উত্তর zhangxaochen - আপনি নীচের অংশে কীভাবে লুপের জন্য একটি কী করতে পারেন তা দেখানোর জন্য আপনার উত্তরটি সম্পাদনা করতে পারবেন, যা ডেটাফ্রেমগুলি তৈরি করে (বছর এবং লিঙ্গ ডেটা সহ) তবে সেগুলি একটি অভিধানে যুক্ত করে যাতে তারা আমার getDF পদ্ধতিতে পরে অ্যাক্সেস করতে পারে? ডিফ গেটডিএফ (ডিক্ট, কী): রিটার্ন ডিক [কী]
যোশিশারি

@ ইয়োশিসেরি keyআপনার মত কি getDF? একটি একক প্যারামিটার বা চাবি একটি tuple? নির্দিষ্ট plz;) হন
ঝাংক্সাওচেন

হাই, এটি একটি একক কী, কেবল একটি শব্দ, যা লিঙ্গ (পুরুষ, বা মহিলা) বা বছরের সাথে মিলিত হবে (13, 14) আপনি কীগুলির একটি টুপল রাখতে পারেন তা জানতেন না। আপনি কখন এবং কীভাবে এটি করবেন তার একটি উদাহরণ ভাগ করতে পারেন?
yoshiserry

আপনি কি এই প্রশ্নটি একবার দেখতে পারেন? আমার মনে হচ্ছে আপনি উত্তর দিতে পারেন। আবার পান্ডাস ডেটাফ্রেমে সম্পর্কিত। stackoverflow.com/questions/22086619/...
yoshiserry

4
মনে রাখবেন যে Genderএবং Yearউভয়ই স্ট্রিং হওয়া উচিত, অর্থাত্, 'Gender'এবং 'Year'
স্টিভেন সি হাওয়েল

22

আপনি আরও সাধারণ বুলিয়ান ফাংশনগুলির জন্য যা ফিল্টার হিসাবে ব্যবহার করতে চান এবং এটি একাধিক কলামের উপর নির্ভর করে আপনি ব্যবহার করতে পারেন:

df = df[df[['col_1','col_2']].apply(lambda x: f(*x), axis=1)]

যেখানে f হল এমন একটি ফাংশন যা কোল_1 এবং কল_2 থেকে প্রতিটি জোড় উপাদানের (x1, x2) এ প্রয়োগ হয় এবং আপনি যে কোনও শর্ত (x1, x2) এর উপর নির্ভর করে সত্য বা মিথ্যা ফিরিয়ে দেন।


13

পান্ডাস 0.13 থেকে শুরু করুন , এটি সর্বাধিক দক্ষ উপায়।

df.query('Gender=="Male" & Year=="2014" ')

4
কেন এটি গৃহীত উত্তরের চেয়ে বেশি দক্ষ হতে হবে?
বাউনার

@ বাউনার কেবলমাত্র উচ্চ-ভোটযুক্ত উত্তরের তুলনায় এটি যাচাই করুন।
redreamality

6
এই উত্তরটি বেঞ্চমার্কটি দেখিয়ে উন্নত হতে পারে
নারদাস

10

যদি কেউ আশ্চর্য হয়ে যায় যে ফিল্টার করার দ্রুততম উপায় কী (গ্রহণযোগ্য উত্তর বা @ রেড্র্যামালিটি থেকে একটি):

import pandas as pd
import numpy as np

length = 100_000
df = pd.DataFrame()
df['Year'] = np.random.randint(1950, 2019, size=length)
df['Gender'] = np.random.choice(['Male', 'Female'], length)

%timeit df.query('Gender=="Male" & Year=="2014" ')
%timeit df[(df['Gender']=='Male') & (df['Year']==2014)]

100,000 সারিগুলির জন্য ফলাফল:

6.67 ms ± 557 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
5.54 ms ± 536 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

10,000,000 সারিগুলির জন্য ফলাফল:

326 ms ± 6.52 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
472 ms ± 25.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

সুতরাং ফলাফল আকার এবং ডেটা উপর নির্ভর করে। আমার ল্যাপটপে, query()500k সারি পরে দ্রুত পায়। আরও, স্ট্রিং অনুসন্ধানে Year=="2014"একটি অপ্রয়োজনীয় ওভারহেড থাকে ( Year==2014দ্রুত হয়)।


4
তবে আমি মনে করি queryসিনট্যাক্সটি আরও কম এবং এসকিউএল-এর কাছাকাছি, যেহেতু এটি ডেটা-র জন্য সুন্দর করে তোলে। কেকের চেরি হ'ল এটি অনেকগুলি সারি দিয়ে দ্রুত :)
সিএসগ্রোন

1

ব্যবহার করে আপনি আপনার নিজের ফিল্টার ফাংশন তৈরি করতে পারেন queryমধ্যে pandas। এখানে আপনার dfসমস্ত kwargsপরামিতি দ্বারা ফলাফল ফিল্টারিং আছে । kwargsআপনার নিজের জন্য ফিল্টার ফাংশন পেতে কিছু ভ্যালিডেটর ( ফিল্টারিং) যুক্ত করতে ভুলবেন না df

def filter(df, **kwargs):
    query_list = []
    for key in kwargs.keys():
        query_list.append(f'{key}=="{kwargs[key]}"')
    query = ' & '.join(query_list)
    return df.query(query)

মার্জিত সমাধানের জন্য ধন্যবাদ! আমি মনে করি এটি বাকি সমস্তগুলির মধ্যে সেরা। এটি কোয়েরি ব্যবহারের দক্ষতার সাথে এটি একটি ফাংশন হিসাবে রাখার বহুমুখিতার সাথে একত্রিত করে।
এ মেরি

0

আপনি ব্যবহার করে একাধিক কলাম (আরো দুই) দ্বারা ফিল্টার করতে পারেন np.logical_andঅপারেটর প্রতিস্থাপন &(অথবা np.logical_orপ্রতিস্থাপন |)

এখানে কাজ করার একটি উদাহরণ রয়েছে যা আপনি একাধিক ক্ষেত্রের জন্য লক্ষ্য মান প্রদান করে। আপনি এটিকে বিভিন্ন ধরণের ফিল্টারিং এবং কী নোটের জন্য মানিয়ে নিতে পারেন:

def filter_df(df, filter_values):
    """Filter df by matching targets for multiple columns.

    Args:
        df (pd.DataFrame): dataframe
        filter_values (None or dict): Dictionary of the form:
                `{<field>: <target_values_list>}`
            used to filter columns data.
    """
    import numpy as np
    if filter_values is None or not filter_values:
        return df
    return df[
        np.logical_and.reduce([
            df[column].isin(target_values) 
            for column, target_values in filter_values.items()
        ])
    ]

ব্যবহার:

df = pd.DataFrame({'a': [1, 2, 3, 4], 'b': [1, 2, 3, 4]})

filter_df(df, {
    'a': [1, 2, 3],
    'b': [1, 2, 4]
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.