स्तंभ मानों के आधार पर डेटाफ़्रेम से पंक्तियों का चयन कैसे करें?


1951

DataFrameपायथन पंडों में कुछ कॉलम में मूल्यों के आधार पर पंक्तियों का चयन कैसे करें ?

SQL में, मैं उपयोग करूंगा:

SELECT *
FROM table
WHERE colume_name = some_value

मैंने पंडों के प्रलेखन को देखने की कोशिश की, लेकिन तुरंत जवाब नहीं मिला।



6
यह SQL के साथ तुलना है: pandas.pydata.org/pandas-docs/stable/comparison_with_sql.html जहाँ आप पांडा को SQL के रूप में चला सकते हैं।
i_thamary

जवाबों:


3753

उन पंक्तियों का चयन करने के लिए जिनका स्तंभ मान एक स्केलर के बराबर है 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'] == some_value] भी काम करता है। लेकिन मेरा पहला प्रयास, df.where (df ['colume_name'] == some_value) काम नहीं करता ... निश्चित नहीं कि क्यों ...
szli

13
जब आप उपयोग करते हैं df.where(condition), तो स्थिति के समान आकार होना चाहिए df
अनटुब

3
उन लिंक्स आप में से कई के लिए बहुत उपयोगी हो सकता है: pandas.pydata.org/pandas-docs/stable/indexing.html gregreda.com/2013/10/26/working-with-pandas-dataframes
tremendows

8
FYI करें: यदि आप दो (या अधिक) लेबल (या तो या दोनों की आवश्यकता है) के आधार पर एक पंक्ति का चयन करना चाहते हैं, तो stackoverflow.com/questions/31756340/…
Shane

7
चूंकि df[df['column_name'] == some_value]काम करता है, हमें .locयहां जोड़ने की आवश्यकता क्यों है ?
qqqwww

311

पांडा डेटा फ़्रेम से पंक्तियों का चयन करने के कई तरीके हैं:

  1. बूलियन अनुक्रमण ( df[df['col'] == value))
  2. स्थितिगत अनुक्रमण ( df.iloc[...])
  3. लेबल अनुक्रमण ( df.xs(...))
  4. df.query(...) एपीआई

नीचे मैं आपको कुछ तकनीकों का उपयोग करने के लिए सलाह के साथ प्रत्येक के उदाहरण दिखाता हूं। मान लें कि हमारी कसौटी कॉलम 'A'== है'foo'

(प्रदर्शन पर ध्यान दें: प्रत्येक आधार प्रकार के लिए, हम पांडा एपीआई का उपयोग करके चीजों को सरल रख सकते हैं या हम एपीआई के बाहर उद्यम कर सकते हैं, आमतौर पर numpyऔर चीजों को गति देते हैं।)


सेटअप
पहली चीज़ जो हमें चाहिए वह है ऐसी स्थिति की पहचान करना जो पंक्तियों के चयन के लिए हमारी कसौटी के रूप में कार्य करेगी। हम ओपी के मामले से शुरू करेंगे column_name == some_value, और कुछ अन्य सामान्य उपयोग के मामलों को भी शामिल करेंगे।

@Unutbu से उधार लेना:

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'

फिर हम इस मास्क का उपयोग डेटा फ्रेम को स्लाइस या इंडेक्स करने के लिए कर सकते हैं

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[...]) में इसके उपयोग के मामले हैं, लेकिन यह उनमें से एक नहीं है। यह पता लगाने के लिए कि हमें स्लाइस कहां करना है, हमें पहले उसी बूलियन विश्लेषण को करने की आवश्यकता है जो हमने ऊपर किया था। यह हमें एक ही कार्य को पूरा करने के लिए एक अतिरिक्त कदम उठाता है।

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
@unutbu हमें यह भी दिखाता है कि मूल्यों के एक समूह में होने के 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
शानदार जवाब! 2 प्रश्न हालांकि, i) .iloc(numpy.where(..))इस योजना में तुलना कैसे होगी ? ii) क्या आप कई शर्तों का उपयोग करते समय रैंकिंग की उम्मीद करेंगे?
posdef

3
के प्रदर्शन के लिए pd.Series.isin, ध्यान दें यह करता है उपयोग np.in1dएक विशिष्ट परिदृश्य में हुड के नीचे, का उपयोग करता है दूसरों में Khash, और परोक्ष हैशिंग विशिष्ट स्थितियों में प्रदर्शन बनाम की लागत के बीच एक व्यापार बंद लागू होता है। इस उत्तर में अधिक विवरण है।
JPP

1
9 स्क्रीनफुल पर, यह एक नए या मध्यवर्ती उपयोगकर्ता के लिए अतिभार है। आप पहले पैराग्राफ में टीएल को आत्म-संक्षेप कर सकते हैं;
मुस्कान

@piRSquared स्केलिंग के मामलों में , आप मन ही मन, @piRSquared को भी अपना अनुभव पोस्ट करने के बारे में बताएंगे कि ब्लॉक-सिंटैक्स के उपरोक्त प्रस्तावित रूपों का उपयोग करने की लागत कितनी है[{P|EXP}TIME] - और [{C|P|EXP}SPACE]- जब एक बार बढ़ने पर संपूर्ण डेटाफ़्रेम (ऊपर-नीचे प्रसंस्करण करना) कुछ पंक्ति में गिना जाता है? हमें पूरी तस्वीर दिखाने के लिए धन्यवाद, सर। क्वांटिटेटिव बेंचमार्क रीडिंग हमेशा स्वागत योग्य है, क्योंकि दोनों और मान बैच की राहत के साथ होते हैं । ~1E6, ~1E9, ~1E12[min, Avg, MAX, StDev]minMAXMean/StDev
user3666197

बहुत बढ़िया जवाब! क्वेरी ने मेरी समस्या हल कर दी!
पावलोस पोनोस

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यहाँ केवल एक ही उत्तर है जो विधि के साथ संगत है। ऐसा लगता है कि यह filterडंपर्स में पंडों का एनालॉग है ।
बर्क यू।

3
नमस्ते, आपके तीसरे उदाहरण (कई कॉलम) में मुझे लगता है कि आपको चौकोर कोष्ठक [चाहिए (जो बाहर की ओर गोल कोष्ठक नहीं हैं ।
user2739472

2
पहले मुझे लगा कि |यह AND के लिए था, लेकिन निश्चित रूप से यह
O-9

और, का उपयोग करते हुए कई स्थितियों के लिए, एक कर सकते हैंdf[condition1][condition2]
ऋत्विक

1
किसी के लिए उपयोगी होने पर इसे यहां छोड़ना: 0.25 क्वेरी का उपयोग स्तंभ नामों के साथ किया जा सकता है, जिनके नाम में 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 ('col == "वैल"')
smerlung

28

अधिक लचीलेपन के .queryसाथ प्रयोग pandas >= 0.25.0:

अगस्त 2019 अपडेटेड उत्तर

चूंकि pandas >= 0.25.0हम queryपैंडास विधियों और यहां तक ​​कि कॉलम नामों के साथ डेटाफ्रेम को फ़िल्टर करने के लिए विधि का उपयोग कर सकते हैं जिनमें रिक्त स्थान हैं। आम तौर पर कॉलम नामों में रिक्त स्थान एक त्रुटि देते हैं, लेकिन अब हम यह हल कर सकते हैं कि बैकटिक (`) का उपयोग करके देखें GitHo :

# 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

बहुत बढ़िया जवाब। बस यह जोड़ना चाहूंगा कि दूसरा (pd.DataFrame) बेमानी है क्योंकि get_group()स्वचालित रूप से एक डेटाफ्रेम वापस आ जाएगा। इसके अलावा आप बस "ड्रॉप = ट्रू" को एक पैरामीटर के रूप में कह सकते हैं reset_index()। दूसरे शब्दों में, इसे छोटा किया जा सकता है: b_is_two_dataframe = df.groupby('B').get_group('two').reset_index(drop=True)
माउंटेन स्कॉट

7

आप .apply का भी उपयोग कर सकते हैं:

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

परिणाम @unutbu द्वारा वर्णित के रूप में उपयोग करने के समान है

df[[df['B'].isin(['one','three'])]]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.