තීරු අගයන් මත පදනම්ව දත්ත රාමුවකින් පේළි තෝරා ගන්නේ කෙසේද?


2000

DataFrameපයිතන් පැන්ඩාස් හි සමහර තීරුවක අගයන් මත පදනම්ව පේළි තෝරා ගන්නේ කෙසේද ?

SQL හි, මම භාවිතා කරන්නේ:

SELECT *
FROM table
WHERE colume_name = some_value

මම පැන්ඩා ලියකියවිලි බැලීමට උත්සාහ කළ නමුත් වහාම පිළිතුර සොයාගත නොහැකි විය.


මෙහි පරීක්ෂා කරන්න: github.com/debaonline4u/Python_Programming/tree/master/…
debaonline4u

6
මෙය SQL සමඟ සැසඳීමකි : pandas.pydata.org/pandas-docs/stable/comparison_with_sql.html එහිදී ඔබට පැන්ඩා SQL ලෙස ධාවනය කළ හැකිය.
i_thamary

Answers:


3857

තීරු අගය පරිමාණයට සමාන පේළි තෝරා ගැනීමට 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)]

වරහන් සටහන් කරන්න. Python හි හේතුවෙන් ක්රියාකරු තැනක්ද නීති , &පොදුයි වඩා තදින් වඩා <=හා >=. මේ අනුව, අවසාන උදාහරණයේ වරහන් අවශ්‍ය වේ. වරහන් නොමැතිව

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

ලෙස විග්‍රහ කර ඇත

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

එහි ප්‍රති results ලයක් ලෙස ශ්‍රේණියේ සත්‍ය අගය නොපැහැදිලි දෝෂයකි .


තීරු අගය සමාන නොවන පේළි තෝරා ගැනීමට 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

20
ඇත්ත වශයෙන්ම, df [df ['colume_name'] == some_value] ද ක්‍රියා කරයි. නමුත් මගේ පළමු උත්සාහය, df.where (df ['colume_name'] == some_value) ක්‍රියාත්මක නොවේ ... ඇයිදැයි නිශ්චිතවම කිව නොහැක ...
szli

13
ඔබ භාවිතා කරන විට df.where(condition), තත්වයට සමාන හැඩයක් තිබිය යුතුය df.
unutbu

4
එම සබැඳි ඔබ අතරින් බොහෝ දෙනෙක් ඉතා වැදගත් විය හැක: pandas.pydata.org/pandas-docs/stable/indexing.html gregreda.com/2013/10/26/working-with-pandas-dataframes
tremendows

8
FYI: ඔබට ලේබල් දෙකක් (හෝ වැඩි ගණනක්) මත පදනම්ව පේළියක් තෝරා ගැනීමට අවශ්‍ය නම් (දෙකම හෝ දෙකම අවශ්‍ය වේ), stackoverflow.com/questions/31756340/…
ෂේන්

7
df[df['column_name'] == some_value]වැඩ කරන බැවින් , අපට .locමෙහි එකතු කිරීමට අවශ්‍ය ඇයි?
qqqwww

325

පැන්ඩා දත්ත රාමුවකින් පේළි තෝරා ගැනීමට ක්‍රම කිහිපයක් තිබේ:

  1. බූලියන් සුචිගත කිරීම ( df[df['col'] == value])
  2. ස්ථානීය සුචිගත කිරීම ( df.iloc[...])
  3. ලේබල් සුචිගත කිරීම ( df.xs(...))
  4. df.query(...) API

පහත දැක්වෙන ක්‍රමෝපායන් භාවිතා කරන විට උපදෙස් සහිතව, එක් එක් උදාහරණ මම ඔබට පෙන්වන්නෙමි. අපගේ නිර්ණායකය තීරුව 'A'== යැයි උපකල්පනය කරන්න'foo'

(කාර්ය සාධනය මත සටහන: එක් එක් පදනමක් වර්ගය, අපි දේවල් සරල වන pandas API භාවිතයෙන් විසින් තබා ගත හැකි හෝ අපි API පිටත ව්යාපාරයක යෙදිය හැක, සාමාන්යයෙන් බවට numpyවේගය දේවල්, සහ.)


සැකසුම
අපට අවශ්‍ය පළමු දෙය නම් පේළි තේරීම සඳහා අපගේ නිර්ණායකය ලෙස ක්‍රියා කරන කොන්දේසියක් හඳුනා ගැනීමයි. අපි OP නඩුව සමඟ ආරම්භ කරමු column_name == some_value, සහ තවත් පොදු භාවිත අවස්ථා කිහිපයක් ඇතුළත් කරන්නෙමු .

Utunutbu වෙතින් ණයට ගැනීම:

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
අපට දත්ත රාමුව ද ප්‍රතිනිර්මාණය කළ හැකිව තිබුණි. දත්ත රාමුවක් ප්‍රතිනිර්මාණය කිරීමේදී විශාල අවවාදයක් ඇත so එසේ කිරීමේදී ඔබ සැලකිලිමත් විය යුතුය 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(..))මෙම යෝජනා ක්‍රමයේ සැසඳෙන්නේ කෙසේද? බහුවිධ කොන්දේසි භාවිතා කරන විට ශ්‍රේණිගත කිරීම් සමාන වනු ඇතැයි ඔබ අපේක්ෂා කරනවාද?
posdef

3
කටයුතු ඉටු කිරීම සඳහා pd.Series.isinඑය සටහන්, කරන්නේ භාවිතය np.in1dනිශ්චිත රංගනය තුළ ඒ අවටනම් යටතේ, භාවිතා අන් අය තුළ khash, සහ නිසැකයෙන්ම වෙළඳ ලකුණු විශේෂිත තත්වයන් තුළ කාර්ය සාධනය එදිරිව hashing පිරිවැය අතර අදාළ වේ. මෙම පිළිතුරට වැඩි විස්තර ඇත.
jpp

1
තිර පිටපත් 9 කදී, මෙය නව හෝ අතරමැදි පරිශීලකයෙකුට අධික ලෙස පැටවීමකි. පළමු ඡේදයේ ඔබට tl; dr ස්වයං සාරාංශගත කළ හැකිය.
smci

@piRSquared පරිමාණය වැදගත් ද ගැන ඔබගේ අත්දැකීම් පළ කිරීමට, @piRSquared, නොකරමි ඔබ දැක කොතරම් හොඳින් සැබෑ [{P|EXP}TIME] සහ - [{C|P|EXP}SPACE]- පිරිවැය (ඉහල පහළ එකවර මුළු dataframes සකසන) ඉහත සඳහන් යෝජනා වාරණ-කාරක රීති ආකාර භාවිතා වර්ධනය එනම් විට, ~1E6, ~1E9, ~1E12පේළි ගණනකට පරිමාණය කර තිබේද? මුළු පින්තූරයම අපට පෙන්වීම ගැන ස්තූතියි, සර්. සමග ප්රමාණාත්මක මිනුම් දන්ඩ කියවීම් [min, Avg, MAX, StDev]යන දෙකම ලෙස සෑම විටම, පිළිගැනීමට අපි minහා MAXවටිනාකම් සමග Mean/StDevකාණ්ඩයේ සහන.
user3666197

281

tl; dr

පැන්ඩා සමාන වේ

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

නමුත් එම අවස්ථාවේදී මම විමසුම් ශ්‍රිතය භාවිතා කිරීමට නිර්දේශ කරමි , මන්ද එය අඩු වාචික හා එකම ප්‍රති result ලය ලබා දෙයි:

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

6
queryක්‍රම දම්වැල සමඟ අනුකූල වන එකම පිළිතුර මෙහි ඇත. එය filterdplyr හි පැන්ඩා ඇනලොග් මෙන් පෙනේ .
බර්ක් යූ.

3
හායි, ඔබේ තුන්වන උදාහරණයේ (බහු තීරු) පිටතින් [වටකුරු වරහන් නොව හතරැස් වරහන් අවශ්‍ය යැයි මම සිතමි (.
user2739472

2
මුලදී මම සිතුවේ |එය AND සඳහා බවයි, නමුත් ඇත්ත වශයෙන්ම එය OR- ක්‍රියාකරු වේ ...
O-9

AND භාවිතා කරමින් විවිධ කොන්දේසි සඳහා කෙනෙකුට කළ හැකිය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
මගේ නඩුවේදී මට උපුටා දැක්වීමක් අවශ්‍ය වූයේ val යනු නූලක් වන බැවිනි. df.query ('col == "val"')
smerlung

29

භාවිතා වඩා නම්යශීලී බවක් .queryසමග pandas >= 0.25.0:

අගෝස්තු 2019 යාවත්කාලීන කළ පිළිතුර

පැන්ඩස් ක්‍රම සමඟ දත්ත රාමු පෙරීමට සහ අවකාශයන් ඇති තීරු නම් පවා pandas >= 0.25.0අපට භාවිතා කළ හැකි බැවින් query. සාමාන්‍යයෙන් තීරු නම් වල ඇති අවකාශය දෝෂයක් ලබා දෙනු ඇත, නමුත් දැන් අපට බැක්ටික් (`) භාවිතා කර GitHub බලන්න :

# 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

@අපගේ විමසුමේ a සමඟ උපසර්ගයක් යෙදීමෙන් අපට දේශීය විචල්‍යයන් භාවිතා කළ හැකිය :

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

ප්‍රතිදානය

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

26

Numpy.where භාවිතයෙන් වේගවත් ප්‍රති results ල ලබා ගත හැකිය .

උදාහරණයක් ලෙස, unubtu හි සැකසුම සමඟ -

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

18

පැන්ඩා වල දී ඇති අගය සඳහා බහු තීරු වලින් විශේෂිත තීරු පමණක් තෝරා ගැනීම සඳහා:

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()දත්ත රාමුවක් ස්වයංක්‍රීයව නැවත ලැබෙනු ඇත. පරාමිතියක් ලෙස ඔබට "drop = True" යැයි පැවසිය හැකිය 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

ප්‍රති un ල ununutbu සඳහන් කළ ආකාරයටම භාවිතා කරයි

df[[df['B'].isin(['one','three'])]]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.