কলাম মানগুলির উপর ভিত্তি করে ডেটাফ্রেম থেকে সারিগুলি কীভাবে নির্বাচন করবেন?


1948

DataFrameপাইথন পান্ডাসের কয়েকটি কলামে মানের উপর ভিত্তি করে সারিগুলি কীভাবে নির্বাচন করবেন ?

এসকিউএল-এ, আমি ব্যবহার করব:

SELECT *
FROM table
WHERE colume_name = some_value

আমি পান্ডাস ডকুমেন্টেশন দেখার চেষ্টা করেছি কিন্তু তাত্ক্ষণিকভাবে উত্তর খুঁজে পেলাম না।



6
এটি এসকিউএল এর সাথে একটি তুলনা: pandas.pydata.org/pandas-docs/stable/compistance_with_sql.html যেখানে আপনি এসকিউএল হিসাবে পান্ডা চালাতে পারেন।
i_thamary

উত্তর:


3748

যার কলামটির মান একটি স্কেলারের সমান, তা নির্বাচন করতে some_value, ব্যবহার করুন ==:

df.loc[df['column_name'] == some_value]

যার কলামের মানটি পুনরাবৃত্ত হতে পারে সেগুলি নির্বাচন করতে some_values, ব্যবহার করুন isin:

df.loc[df['column_name'].isin(some_values)]

এর সাথে একাধিক শর্ত একত্রিত করুন &:

df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)]

প্রথম বন্ধনী নোট করুন। পাইথনের অপারেটর অগ্রাধিকার নিয়মের কারণে , এবং এর &চেয়ে আরও শক্তভাবে আবদ্ধ হয় । সুতরাং, শেষ উদাহরণে প্রথম বন্ধনীগুলি প্রয়োজনীয়। প্রথম বন্ধনী ছাড়া<=>=

df['column_name'] >= A & df['column_name'] <= B

হিসাবে পার্স করা হয়

df['column_name'] >= (A & df['column_name']) <= B

যার ফলশ্রুতিতে একটি সিরিজের সত্য মানের ফলাফল দ্ব্যর্থক ত্রুটি


যার কলামের মান সমান নয় সেগুলি নির্বাচন করতে some_value, ব্যবহার করুন !=:

df.loc[df['column_name'] != some_value]

isinআয় একটি বুলিয়ান সিরিজ, তাই সারি যার মান নির্বাচন করতে না মধ্যে some_valuesব্যবহার বুলিয়ান সিরিজ অস্বীকার ~:

df.loc[~df['column_name'].isin(some_values)]

উদাহরণ স্বরূপ,

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split(),
                   'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
#      A      B  C   D
# 0  foo    one  0   0
# 1  bar    one  1   2
# 2  foo    two  2   4
# 3  bar  three  3   6
# 4  foo    two  4   8
# 5  bar    two  5  10
# 6  foo    one  6  12
# 7  foo  three  7  14

print(df.loc[df['A'] == 'foo'])

উৎপাদনের

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

আপনার যদি একাধিক মান অন্তর্ভুক্ত করতে চান তবে সেগুলি একটি তালিকায় রাখুন (বা আরও সাধারণভাবে, কোনও পুনরাবৃত্তযোগ্য) এবং ব্যবহার করুন isin:

print(df.loc[df['B'].isin(['one','three'])])

উৎপাদনের

     A      B  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14

তবে নোট করুন, আপনি যদি এটি বেশ কয়েকবার করতে চান তবে প্রথমে একটি সূচক তৈরি করা আরও কার্যকর এবং তারপরে ব্যবহার করুন df.loc:

df = df.set_index(['B'])
print(df.loc['one'])

উৎপাদনের

       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12

বা, সূচক ব্যবহার থেকে একাধিক মান অন্তর্ভুক্ত করতে df.index.isin:

df.loc[df.index.isin(['one','two'])]

উৎপাদনের

       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12

19
প্রকৃতপক্ষে, df [df ['colume_name'] == কিছু_মূল্য] এছাড়াও কাজ করে। তবে আমার প্রথম প্রয়াস, df.where (df ['colume_name'] == কিছু_মূল্য) কাজ করে না ... নিশ্চিত নয় কেন ...
szli

13
আপনি যখন ব্যবহার করবেন তখন df.where(condition)শর্তটি একই আকারে থাকতে হবে df
unutbu

3
সেই লিঙ্কগুলি আপনি অনেক খুবই উপযোগী হতে পারে: pandas.pydata.org/pandas-docs/stable/indexing.html gregreda.com/2013/10/26/working-with-pandas-dataframes
tremendows

8
এফওয়াইআই: আপনি যদি দুটি (বা ততোধিক) লেবেলের উপর ভিত্তি করে একটি সারি নির্বাচন করতে চান (উভয়ই বা উভয়রই
শেন

7
যেহেতু df[df['column_name'] == some_value]কাজ করে, কেন আমাদের .locএখানে যুক্ত করা দরকার ?
qqqwww

310

পান্ডাস ডেটা ফ্রেম থেকে সারিগুলি নির্বাচন করার বিভিন্ন উপায় রয়েছে:

  1. বুলিয়ান ইনডেক্সিং ( df[df['col'] == value])
  2. পজিশনাল ইনডেক্সিং ( df.iloc[...])
  3. লেবেল সূচক ( df.xs(...))
  4. df.query(...) এপিআই

নীচে আমি নির্দিষ্ট কৌশলগুলি কখন ব্যবহার করব সে বিষয়ে পরামর্শ সহ প্রত্যেকটির উদাহরণ দেখাব। ধরুন আমাদের মানদণ্ডটি কলাম 'A'=='foo'

(পারফরম্যান্সের উপর নোট: প্রতিটি বেস টাইপের জন্য, আমরা পান্ডাস এপিআই ব্যবহার করে জিনিসগুলিকে সহজ রাখতে পারি বা আমরা সাধারণত এপিআই এর বাইরে numpy, এবং জিনিসগুলিকে গতি বাড়িয়ে তুলতে পারি))


সেটআপ
আমাদের প্রথম জিনিসটির প্রয়োজন হবে একটি শর্ত চিহ্নিত করা যা সারিগুলি নির্বাচন করার জন্য আমাদের মানদণ্ড হিসাবে কাজ করবে। আমরা ওপি'র কেসটি দিয়ে শুরু করব column_name == some_value, এবং কিছু সাধারণ ব্যবহারের কেস অন্তর্ভুক্ত করব।

@ ইউনতবু থেকে ingণ নেওয়া:

import pandas as pd, numpy as np

df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split(),
                   'C': np.arange(8), 'D': np.arange(8) * 2})

1. বুলিয়ান সূচীকরণ

... বুলিয়ান ইনডেক্সিংয়ের জন্য প্রতিটি সারির 'A'কলামের সমান হওয়াতে তার সঠিক মান খুঁজে পাওয়া দরকার এবং 'foo'তারপরে কোন সারিগুলি রাখা উচিত তা সনাক্ত করতে সেই সত্যের মানগুলি ব্যবহার করে। সাধারণত, আমরা এই সিরিজটির নাম দেব, সত্যের মূল্যবোধগুলির একটি অ্যারে mask,। আমরা এখানেও তাই করব।

mask = df['A'] == 'foo'

এরপরে আমরা এই মুখোশটি ডেটা ফ্রেমকে টুকরো টুকরো করতে বা সূচি করতে ব্যবহার করতে পারি can

df[mask]

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

এই কাজটি সম্পাদন করার এটি সহজতম উপায়গুলির মধ্যে একটি এবং যদি পারফরম্যান্স বা স্বজ্ঞাততা কোনও সমস্যা না হয় তবে এটি আপনার চয়ন করা পদ্ধতি হওয়া উচিত। তবে, কর্মক্ষমতা যদি উদ্বেগের বিষয় হয় তবে আপনি এটি তৈরির বিকল্প উপায় বিবেচনা করতে পারেন mask


2. পজিশনাল ইনডেক্সিং

পজিশনাল ইনডেক্সিং ( df.iloc[...]) এর ব্যবহারের কেস রয়েছে তবে এটি তাদের মধ্যে একটি নয়। কোথায় টুকরো টুকরো টুকরো টুকরো তা চিহ্নিত করার জন্য প্রথমে আমাদের উপরে একই বুলিয়ান বিশ্লেষণ করা দরকার। এটি একই কাজ সম্পাদন করতে আমাদের আরও একটি পদক্ষেপ সম্পাদন করে leaves

mask = df['A'] == 'foo'
pos = np.flatnonzero(mask)
df.iloc[pos]

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

3. লেবেল সূচীকরণ

লেবেল সূচিকরণ খুব সহজ হতে পারে, তবে এই ক্ষেত্রে আমরা আবার কোনও লাভের জন্য আরও কাজ করছি

df.set_index('A', append=True, drop=False).xs('foo', level=1)

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

4. df.query()এপিআই

pd.DataFrame.queryএই কাজটি সম্পাদন করার জন্য খুব মার্জিত / স্বজ্ঞাত উপায়, তবে প্রায়শই ধীর হয়। তবে , যদি আপনি নীচের সময়গুলিতে মনোযোগ দেন তবে বড় ডেটার জন্য, ক্যোয়ারীটি খুব দক্ষ। আমার সর্বোত্তম পরামর্শ হিসাবে স্ট্যান্ডার্ড পদ্ধতির এবং অনুরূপ বিশালতার চেয়ে বেশি।

df.query('A == "foo"')

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

আমার পছন্দটি ব্যবহার করা Boolean mask

আমরা কীভাবে তৈরি করব তা পরিবর্তনের মাধ্যমে প্রকৃত উন্নতি করা যেতে পারে Boolean mask

maskবিকল্প 1
অন্তর্নিহিত numpyঅ্যারে ব্যবহার করুন এবং অন্যটি তৈরি করার ওভারহেডটি রেখে যানpd.Series

mask = df['A'].values == 'foo'

আমি শেষে আরও সম্পূর্ণ সময়ের পরীক্ষাগুলি দেখাব, তবে কেবলমাত্র নমুনা ডেটা ফ্রেম ব্যবহার করে আমরা যে পারফরম্যান্স লাভ করেছি তা একবার দেখুন। প্রথমত, আমরা তৈরির পার্থক্যটি দেখিmask

%timeit mask = df['A'].values == 'foo'
%timeit mask = df['A'] == 'foo'

5.84 µs ± 195 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
166 µs ± 4.45 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

অ্যারের maskসাথে মূল্যায়ন numpyকরা ~ 30 গুণ দ্রুত। এটি আংশিকভাবে numpyমূল্যায়নের কারণে প্রায়শই দ্রুত হয়। এটি একটি আংশিক কারণ একটি সূচক এবং এর সাথে সম্পর্কিত pd.Seriesকোনও বস্তু তৈরি করার জন্য প্রয়োজনীয় ওভারহেডের অভাবের কারণেও রয়েছে ।

এরপরে, আমরা একে অন্যের maskবিপরীতে কাটানোর সময়টি লক্ষ্য করব ।

mask = df['A'].values == 'foo'
%timeit df[mask]
mask = df['A'] == 'foo'
%timeit df[mask]

219 µs ± 12.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
239 µs ± 7.03 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

পারফরম্যান্স লাভগুলি যেমন উচ্চারণ হয় না। এটি আরও শক্তিশালী পরীক্ষার উপর নির্ভর করে কিনা তা আমরা দেখতে পাব।


maskবিকল্প 2
আমরা পাশাপাশি ডেটা ফ্রেমটি পুনর্গঠন করতে পারতাম। ডেটাফ্রেমের পুনর্গঠন করার সময় একটি বড় সতর্কতা রয়েছে — আপনাকে অবশ্যই এর যত্ন নেওয়া উচিতdtypes সময় !

পরিবর্তে df[mask]আমরা এই কাজ করব

pd.DataFrame(df.values[mask], df.index[mask], df.columns).astype(df.dtypes)

যদি ডেটা ফ্রেমটি মিশ্র প্রকারের হয়, যা আমাদের উদাহরণ, তবে আমরা যখন df.valuesফলস্বরূপ অ্যারে পাই dtype objectএবং ফলস্বরূপ, নতুন ডেটা ফ্রেমের সমস্ত কলাম হবে dtype object। এইভাবে astype(df.dtypes)কোনও সম্ভাব্য পারফরম্যান্স লাভের প্রয়োজন এবং হত্যার জন্য।

%timeit df[m]
%timeit pd.DataFrame(df.values[mask], df.index[mask], df.columns).astype(df.dtypes)

216 µs ± 10.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1.43 ms ± 39.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

যাইহোক, যদি ডেটা ফ্রেমটি মিশ্র প্রকারের না হয় তবে এটি করার জন্য এটি খুব দরকারী।

প্রদত্ত

np.random.seed([3,1415])
d1 = pd.DataFrame(np.random.randint(10, size=(10, 5)), columns=list('ABCDE'))

d1

   A  B  C  D  E
0  0  2  7  3  8
1  7  0  6  8  6
2  0  2  0  4  9
3  7  3  2  4  3
4  3  6  7  7  4
5  5  3  7  5  9
6  8  7  6  4  7
7  6  2  6  6  5
8  2  8  7  5  8
9  4  7  6  1  5    

%%timeit
mask = d1['A'].values == 7
d1[mask]

179 µs ± 8.73 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

বনাম

%%timeit
mask = d1['A'].values == 7
pd.DataFrame(d1.values[mask], d1.index[mask], d1.columns)

87 µs ± 5.12 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

আমরা সময় অর্ধেক কাটা।


maskবিকল্প 3
@ ইউন্টবুও আমাদের দেখায় যে কীভাবে pd.Series.isinপ্রতিটি df['A']মানগুলির একটি সংখ্যায় থাকা প্রতিটি উপাদানগুলির জন্য অ্যাকাউন্টে ব্যবহার করতে হয় । এটি একই জিনিসকে মূল্যায়ন করে যদি আমাদের মানগুলির সেটটি একটি মানের একটি সেট হয়, যথা 'foo'। তবে এটি প্রয়োজনে বড় আকারের মানগুলি অন্তর্ভুক্ত করতে সাধারণীকরণ করে। দেখা যাচ্ছে, এটি আরও সাধারণ সমাধান হওয়া সত্ত্বেও এটি এখনও বেশ দ্রুত। একমাত্র আসল ক্ষতি হ'ল এই ধারণার সাথে পরিচিত নয় তাদের ক্ষেত্রে স্বজ্ঞাততা।

mask = df['A'].isin(['foo'])
df[mask]

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

যাইহোক, numpyপূর্বের মতো, কার্যত কিছুই বলিদানের সময় আমরা পারফরম্যান্স উন্নত করতে ব্যবহার করতে পারি । আমরা ব্যবহার করবnp.in1d

mask = np.in1d(df['A'].values, ['foo'])
df[mask]

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

সময় নির্ধারণের জন্য
আমি অন্যান্য পোস্টে উল্লিখিত অন্যান্য ধারণাগুলিও অন্তর্ভুক্ত করব।
নীচে কোড

এই টেবিলের প্রতিটি কলাম একটি পৃথক দৈর্ঘ্যের ডেটা ফ্রেম উপস্থাপন করে যার উপরে আমরা প্রতিটি ফাংশন পরীক্ষা করি। প্রতিটি কলামটি তুলনামূলকভাবে সময় নিয়েছে, এর সাথে বেজ সূচককে দেওয়া দ্রুততম ফাংশন 1.0

res.div(res.min())

                         10        30        100       300       1000      3000      10000     30000
mask_standard         2.156872  1.850663  2.034149  2.166312  2.164541  3.090372  2.981326  3.131151
mask_standard_loc     1.879035  1.782366  1.988823  2.338112  2.361391  3.036131  2.998112  2.990103
mask_with_values      1.010166  1.000000  1.005113  1.026363  1.028698  1.293741  1.007824  1.016919
mask_with_values_loc  1.196843  1.300228  1.000000  1.000000  1.038989  1.219233  1.037020  1.000000
query                 4.997304  4.765554  5.934096  4.500559  2.997924  2.397013  1.680447  1.398190
xs_label              4.124597  4.272363  5.596152  4.295331  4.676591  5.710680  6.032809  8.950255
mask_with_isin        1.674055  1.679935  1.847972  1.724183  1.345111  1.405231  1.253554  1.264760
mask_with_in1d        1.000000  1.083807  1.220493  1.101929  1.000000  1.000000  1.000000  1.144175

আপনি লক্ষ্য করবেন যে দ্রুততম সময়গুলি mask_with_valuesএবং এর মধ্যে ভাগ করা বলে মনে হচ্ছেmask_with_in1d

res.T.plot(loglog=True)

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

ক্রিয়াকলাপ

def mask_standard(df):
    mask = df['A'] == 'foo'
    return df[mask]

def mask_standard_loc(df):
    mask = df['A'] == 'foo'
    return df.loc[mask]

def mask_with_values(df):
    mask = df['A'].values == 'foo'
    return df[mask]

def mask_with_values_loc(df):
    mask = df['A'].values == 'foo'
    return df.loc[mask]

def query(df):
    return df.query('A == "foo"')

def xs_label(df):
    return df.set_index('A', append=True, drop=False).xs('foo', level=-1)

def mask_with_isin(df):
    mask = df['A'].isin(['foo'])
    return df[mask]

def mask_with_in1d(df):
    mask = np.in1d(df['A'].values, ['foo'])
    return df[mask]

পরীক্ষামূলক

res = pd.DataFrame(
    index=[
        'mask_standard', 'mask_standard_loc', 'mask_with_values', 'mask_with_values_loc',
        'query', 'xs_label', 'mask_with_isin', 'mask_with_in1d'
    ],
    columns=[10, 30, 100, 300, 1000, 3000, 10000, 30000],
    dtype=float
)

for j in res.columns:
    d = pd.concat([df] * j, ignore_index=True)
    for i in res.index:a
        stmt = '{}(d)'.format(i)
        setp = 'from __main__ import d, {}'.format(i)
        res.at[i, j] = timeit(stmt, setp, number=50)

বিশেষ সময় সম্পূর্ণ
বিভাগের dtypeফ্রেমের জন্য যখন আমাদের একক অ-অবজেক্ট থাকে তখন বিশেষ ক্ষেত্রে তাকানো। নীচে কোড

spec.div(spec.min())

                     10        30        100       300       1000      3000      10000     30000
mask_with_values  1.009030  1.000000  1.194276  1.000000  1.236892  1.095343  1.000000  1.000000
mask_with_in1d    1.104638  1.094524  1.156930  1.072094  1.000000  1.000000  1.040043  1.027100
reconstruct       1.000000  1.142838  1.000000  1.355440  1.650270  2.222181  2.294913  3.406735

দেখা যাচ্ছে, কয়েকশো সারি পেরিয়ে পুনর্নির্মাণের পক্ষে এটি উপযুক্ত নয়।

spec.T.plot(loglog=True)

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

ক্রিয়াকলাপ

np.random.seed([3,1415])
d1 = pd.DataFrame(np.random.randint(10, size=(10, 5)), columns=list('ABCDE'))

def mask_with_values(df):
    mask = df['A'].values == 'foo'
    return df[mask]

def mask_with_in1d(df):
    mask = np.in1d(df['A'].values, ['foo'])
    return df[mask]

def reconstruct(df):
    v = df.values
    mask = np.in1d(df['A'].values, ['foo'])
    return pd.DataFrame(v[mask], df.index[mask], df.columns)

spec = pd.DataFrame(
    index=['mask_with_values', 'mask_with_in1d', 'reconstruct'],
    columns=[10, 30, 100, 300, 1000, 3000, 10000, 30000],
    dtype=float
)

পরীক্ষামূলক

for j in spec.columns:
    d = pd.concat([df] * j, ignore_index=True)
    for i in spec.index:
        stmt = '{}(d)'.format(i)
        setp = 'from __main__ import d, {}'.format(i)
        spec.at[i, j] = timeit(stmt, setp, number=50)

6
চমত্কার উত্তর! ২ টি প্রশ্ন যদিও, i) .iloc(numpy.where(..))এই স্কিমের সাথে কীভাবে তুলনা করা হবে ? ii) একাধিক শর্ত ব্যবহার করার সময় আপনি কি র‌্যাঙ্কিং একই হওয়ার আশা করবেন?
পোস্টেফ

3
এর কার্য সম্পাদনের জন্য pd.Series.isin, নোট করুন এটি কোনওnp.in1d নির্দিষ্ট দৃশ্যে হুডের নীচে ব্যবহার করে, অন্যগুলিতে খাস ব্যবহার করে এবং নির্দিষ্ট পরিস্থিতিতে হ্যাশিং ব্যয়ের পারফরম্যান্সের মধ্যে স্পষ্টতই একটি বাণিজ্য বন্ধ প্রয়োগ করে। এই উত্তরে আরও বিশদ রয়েছে।
জেপ্পি

1
9 টি স্ক্রিনফুল এ, নতুন বা এমনকি মধ্যবর্তী ব্যবহারকারীর জন্য এটি ওভারলোড। আপনি প্রথম অনুচ্ছেদে টিএলড্রাক্টের স্ব-সংক্ষিপ্তসার করতে এবং উচিত।
smci

@piRSquared স্কেলিং গুরুত্বপূর্ণ ব্যাপারে কিছু মনে, @piRSquared, এছাড়াও সম্পর্কে আপনার অভিজ্ঞতা পোষ্ট করতে কত ভাল প্রকৃত [{P|EXP}TIME] - এবং [{C|P|EXP}SPACE]- খরচ ব্লক-বাক্য গঠন প্রস্তাবিত ফর্ম উপরে ব্যবহারের (প্রক্রিয়াকরণের একবারে টপ-ডাউন পুরো dataframes) হত্তয়া , যথা যখন কিছু ~1E6, ~1E9, ~1E12সারিতে গণনা করা? আমাদের পুরো ছবিটি দেখানোর জন্য ধন্যবাদ স্যার। [min, Avg, MAX, StDev]পরিমাণ সহ মানদণ্ডের পাঠগুলি সর্বদা স্বাগত, কারণ ব্যাচের স্বস্তির সাথে মান minএবং MAXমান উভয়ই থাকে Mean/StDev
ব্যবহারকারী3666197

দুর্দান্ত উত্তর! প্রশ্নটি আমার সমস্যার সমাধান!
পাভলোস পোনস

280

TL; ড

সমান পান্ডা

select * from table where column_name = some_value

হয়

table[table.column_name == some_value]

একাধিক শর্ত:

table[(table.column_name == some_value) | (table.column_name2 == some_value2)]

অথবা

table.query('column_name == some_value | column_name2 == some_value2')

কোড উদাহরণ

import pandas as pd

# Create data set
d = {'foo':[100, 111, 222], 
     'bar':[333, 444, 555]}
df = pd.DataFrame(d)

# Full dataframe:
df

# Shows:
#    bar   foo 
# 0  333   100
# 1  444   111
# 2  555   222

# Output only the row(s) in df where foo is 222:
df[df.foo == 222]

# Shows:
#    bar  foo
# 2  555  222

উপরের কোডে এটি লাইনটি এই ক্ষেত্রে df[df.foo == 222]কলাম মানের উপর ভিত্তি করে সারি দেয় 222

একাধিক শর্তও সম্ভব:

df[(df.foo == 222) | (df.bar == 444)]
#    bar  foo
# 1  444  111
# 2  555  222

তবে সেই মুহূর্তে আমি ক্যোয়ারী ফাংশনটি ব্যবহার করার পরামর্শ দেব , যেহেতু এটি কম ভার্বোস এবং একই ফলাফল দেয়:

df.query('foo == 222 | bar == 444')

5
queryএখানে একমাত্র উত্তর যা পদ্ধতি শৃঙ্খলার সাথে সামঞ্জস্যপূর্ণ। দেখে মনে হচ্ছে এটি filterdplyr তে পান্ডাস অ্যানালগ ।
বার্ক ইউ

3
হাই, আপনার তৃতীয় উদাহরণে (একাধিক কলাম) আমার মনে হয় আপনার বাইরের দিকে [বৃত্তাকার বন্ধনী নয় বর্গাকার বন্ধনী প্রয়োজন (
user2739472

2
প্রথমে আমি ভেবেছিলাম এটি |AND এর জন্য ছিল তবে অবশ্যই এটি OR- অপারেটর ...
O-9

ব্যবহার করে এবং জন্য একাধিক শর্ত, এক কাজ করতে পারেনdf[condition1][condition2]
ঋত্বিক

1
কারও পক্ষে এটি দরকারী হলে এটি এখানে রেখে যান: ০.২৫ থেকে df.query('`my col` == 124')
ক্যোরিয়ামটি

65

আমি পূর্ববর্তী উত্তরগুলির বাক্য গঠনটি অনর্থক এবং মনে রাখা কঠিন বলে মনে করি। পান্ডস query()v0.13 এ পদ্ধতিটি চালু করেছিলেন এবং আমি এটির চেয়ে বেশি পছন্দ করি। আপনার প্রশ্নের জন্য, আপনি করতে পারেনdf.query('col == val')

Http://pandas.pydata.org/pandas-docs/version/0.17.0/indexing.html#indexing-query থেকে পুনরুত্পাদন

In [167]: n = 10

In [168]: df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc'))

In [169]: df
Out[169]: 
          a         b         c
0  0.687704  0.582314  0.281645
1  0.250846  0.610021  0.420121
2  0.624328  0.401816  0.932146
3  0.011763  0.022921  0.244186
4  0.590198  0.325680  0.890392
5  0.598892  0.296424  0.007312
6  0.634625  0.803069  0.123872
7  0.924168  0.325076  0.303746
8  0.116822  0.364564  0.454607
9  0.986142  0.751953  0.561512

# pure python
In [170]: df[(df.a < df.b) & (df.b < df.c)]
Out[170]: 
          a         b         c
3  0.011763  0.022921  0.244186
8  0.116822  0.364564  0.454607

# query
In [171]: df.query('(a < b) & (b < c)')
Out[171]: 
          a         b         c
3  0.011763  0.022921  0.244186
8  0.116822  0.364564  0.454607

আপনি একটি প্রাক সরবরাহ করে পরিবেশে পরিবর্তনশীল অ্যাক্সেস করতে পারেন @

exclude = ('red', 'orange')
df.query('color not in @exclude')

1
আপনার কেবল প্যাকেজ numexprইনস্টল করা দরকার ।
মেরোজ

4
আমার ক্ষেত্রে আমার উদ্ধৃতি প্রয়োজন কারণ ভ্যাল একটি স্ট্রিং। df.query ('কল == "ভাল" ")
স্মারলং

28

এর .queryসাথে ব্যবহার করে আরও নমনীয়তা pandas >= 0.25.0:

আগস্ট 2019 আপডেট উত্তর

যেহেতু pandas >= 0.25.0আমরা queryপদ্ধতিটি প্যান্ডাস পদ্ধতি এবং এমনকি কলামের নাম সহ ফাঁকা রয়েছে এমনগুলি দিয়ে ডেটাফ্রেমগুলি ফিল্টার করতে পারি । সাধারণত কলামের নামগুলির ফাঁকা স্থানগুলি একটি ত্রুটি দেয় তবে এখন আমরা ব্যাকটিক (`) ব্যবহার করে এটি সমাধান করতে পারি গিটহাব দেখুন :

# Example dataframe
df = pd.DataFrame({'Sender email':['ex@example.com', "reply@shop.com", "buy@shop.com"]})

     Sender email
0  ex@example.com
1  reply@shop.com
2    buy@shop.com

.queryপদ্ধতি সহ ব্যবহার str.endswith:

df.query('`Sender email`.str.endswith("@shop.com")')

আউটপুট

     Sender email
1  reply@shop.com
2    buy@shop.com

এছাড়াও আমরা স্থানীয় @প্রশ্নের সাথে আমাদের ক্যোয়ারিতে একটি উপসর্গ রেখে এটি ব্যবহার করতে পারি :

domain = 'shop.com'
df.query('`Sender email`.str.endswith(@domain)')

আউটপুট

     Sender email
1  reply@shop.com
2    buy@shop.com

26

নম্পি.হোয়ার ব্যবহার করে দ্রুত ফলাফল অর্জন করা যায়

উদাহরণস্বরূপ, আনব্টুর সেটআপ সহ -

In [76]: df.iloc[np.where(df.A.values=='foo')]
Out[76]: 
     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

সময় তুলনা:

In [68]: %timeit df.iloc[np.where(df.A.values=='foo')]  # fastest
1000 loops, best of 3: 380 µs per loop

In [69]: %timeit df.loc[df['A'] == 'foo']
1000 loops, best of 3: 745 µs per loop

In [71]: %timeit df.loc[df['A'].isin(['foo'])]
1000 loops, best of 3: 562 µs per loop

In [72]: %timeit df[df.A=='foo']
1000 loops, best of 3: 796 µs per loop

In [74]: %timeit df.query('(A=="foo")')  # slowest
1000 loops, best of 3: 1.71 ms per loop

24

এখানে একটি সহজ উদাহরণ

from pandas import DataFrame

# Create data set
d = {'Revenue':[100,111,222], 
     'Cost':[333,444,555]}
df = DataFrame(d)


# mask = Return True when the value in column "Revenue" is equal to 111
mask = df['Revenue'] == 111

print mask

# Result:
# 0    False
# 1     True
# 2    False
# Name: Revenue, dtype: bool


# Select * FROM df WHERE Revenue = 111
df[mask]

# Result:
#    Cost    Revenue
# 1  444     111

17

পান্ডায় প্রদত্ত মানের জন্য একাধিক কলামের মধ্যে কেবলমাত্র নির্দিষ্ট কলামগুলি নির্বাচন করার জন্য:

select col_name1, col_name2 from table where column_name = some_value.

বিকল্প:

df.loc[df['column_name'] == some_value][[col_name1, col_name2]]

অথবা

df.query['column_name' == 'some_value'][[col_name1, col_name2]]

16

এই বিখ্যাত প্রশ্নের সাথে যুক্ত হওয়ার জন্য (যদিও কিছুটা দেরি হয়ে গেছে): আপনি df.groupby('column_name').get_group('column_desired_value').reset_index()নির্দিষ্ট কলামযুক্ত একটি নির্দিষ্ট মান সহ একটি নতুন ডেটা ফ্রেম তৈরি করতেও পারেন । যেমন

import pandas as pd
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split()})
print("Original dataframe:")
print(df)

b_is_two_dataframe = pd.DataFrame(df.groupby('B').get_group('two').reset_index()).drop('index', axis = 1) 
#NOTE: the final drop is to remove the extra index column returned by groupby object
print('Sub dataframe where B is two:')
print(b_is_two_dataframe)

এটি দেয় চালান:

Original dataframe:
     A      B
0  foo    one
1  bar    one
2  foo    two
3  bar  three
4  foo    two
5  bar    two
6  foo    one
7  foo  three
Sub dataframe where B is two:
     A    B
0  foo  two
1  foo  two
2  bar  two

দুর্দান্ত উত্তর। কেবল যুক্ত করতে চাই যে দ্বিতীয় (পিডি.ডাটাফ্রেম) অপ্রয়োজনীয় কারণ get_group()স্বয়ংক্রিয়ভাবে কোনও ডেটাফ্রেম ফিরে আসবে। এছাড়াও আপনি কেবলমাত্র "ড্রপ = ট্রু" বলতে পারেন এর পরামিতি হিসাবে reset_index()। অন্য কথায়, এটি সংক্ষিপ্ত করা যেতে পারে: b_is_two_dataframe = df.groupby('B').get_group('two').reset_index(drop=True)
মাউন্টেন স্কট

7

আপনি। অ্যাপ্লিকেশন ব্যবহার করতে পারেন:

df.apply(lambda row: row[df['B'].isin(['one','three'])])

এটি প্রকৃতপক্ষে সারি অনুসারে কাজ করে (অর্থাত্ প্রতিটি সারিটিতে এটি প্রয়োগ করে)।

আউটপুট হয়

   A      B  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14

ফলাফলগুলি @ ইউনতবু দ্বারা উল্লিখিত হিসাবে ব্যবহারের মতোই

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