DataFrame
පයිතන් පැන්ඩාස් හි සමහර තීරුවක අගයන් මත පදනම්ව පේළි තෝරා ගන්නේ කෙසේද ?
SQL හි, මම භාවිතා කරන්නේ:
SELECT *
FROM table
WHERE colume_name = some_value
මම පැන්ඩා ලියකියවිලි බැලීමට උත්සාහ කළ නමුත් වහාම පිළිතුර සොයාගත නොහැකි විය.
DataFrame
පයිතන් පැන්ඩාස් හි සමහර තීරුවක අගයන් මත පදනම්ව පේළි තෝරා ගන්නේ කෙසේද ?
SQL හි, මම භාවිතා කරන්නේ:
SELECT *
FROM table
WHERE colume_name = some_value
මම පැන්ඩා ලියකියවිලි බැලීමට උත්සාහ කළ නමුත් වහාම පිළිතුර සොයාගත නොහැකි විය.
Answers:
තීරු අගය පරිමාණයට සමාන පේළි තෝරා ගැනීමට 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
df.where(condition)
, තත්වයට සමාන හැඩයක් තිබිය යුතුය df
.
df[df['column_name'] == some_value]
වැඩ කරන බැවින් , අපට .loc
මෙහි එකතු කිරීමට අවශ්ය ඇයි?
පැන්ඩා දත්ත රාමුවකින් පේළි තෝරා ගැනීමට ක්රම කිහිපයක් තිබේ:
df[df['col'] == value
])df.iloc[...]
)df.xs(...)
)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})
... බූලියන් සුචිගත කිරීම සඳහා එක් එක් පේළියේ '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
.
ස්ථානීය සුචිගත කිරීම ( 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
ලේබල් සුචිගත කිරීම ඉතා පහසු විය හැකි නමුත් මේ අවස්ථාවේ දී, අපි නැවත කිසිදු ප්රතිලාභයක් නොමැතිව වැඩි වැඩ කොටසක් කරන්නෙමු
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
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)
.iloc(numpy.where(..))
මෙම යෝජනා ක්රමයේ සැසඳෙන්නේ කෙසේද? බහුවිධ කොන්දේසි භාවිතා කරන විට ශ්රේණිගත කිරීම් සමාන වනු ඇතැයි ඔබ අපේක්ෂා කරනවාද?
pd.Series.isin
එය සටහන්, කරන්නේ භාවිතය np.in1d
නිශ්චිත රංගනය තුළ ඒ අවටනම් යටතේ, භාවිතා අන් අය තුළ khash, සහ නිසැකයෙන්ම වෙළඳ ලකුණු විශේෂිත තත්වයන් තුළ කාර්ය සාධනය එදිරිව hashing පිරිවැය අතර අදාළ වේ. මෙම පිළිතුරට වැඩි විස්තර ඇත.
[{P|EXP}TIME]
සහ - [{C|P|EXP}SPACE]
- පිරිවැය (ඉහල පහළ එකවර මුළු dataframes සකසන) ඉහත සඳහන් යෝජනා වාරණ-කාරක රීති ආකාර භාවිතා වර්ධනය එනම් විට, ~1E6, ~1E9, ~1E12
පේළි ගණනකට පරිමාණය කර තිබේද? මුළු පින්තූරයම අපට පෙන්වීම ගැන ස්තූතියි, සර්. සමග ප්රමාණාත්මක මිනුම් දන්ඩ කියවීම් [min, Avg, MAX, StDev]
යන දෙකම ලෙස සෑම විටම, පිළිගැනීමට අපි min
හා MAX
වටිනාකම් සමග Mean/StDev
කාණ්ඩයේ සහන.
පැන්ඩා සමාන වේ
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')
query
ක්රම දම්වැල සමඟ අනුකූල වන එකම පිළිතුර මෙහි ඇත. එය filter
dplyr හි පැන්ඩා ඇනලොග් මෙන් පෙනේ .
[
වටකුරු වරහන් නොව හතරැස් වරහන් අවශ්ය යැයි මම සිතමි (
.
|
එය AND සඳහා බවයි, නමුත් ඇත්ත වශයෙන්ම එය OR- ක්රියාකරු වේ ...
df[condition1][condition2]
df.query('`my col` == 124')
පෙර පිළිතුරු වල වාක්ය ඛණ්ඩය අතිරික්ත හා මතක තබා ගැනීමට අපහසු බව මට පෙනේ. පැන්ඩාස් 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')
numexpr
ස්ථාපනය කිරීම පමණි .
.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
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
මෙන්න සරල උදාහරණයක්
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
පැන්ඩා වල දී ඇති අගය සඳහා බහු තීරු වලින් විශේෂිත තීරු පමණක් තෝරා ගැනීම සඳහා:
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]]
මෙම සුප්රසිද්ධ ප්රශ්නයට එකතු කිරීම සඳහා (ටිකක් ප්රමාද වුවද): 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()
දත්ත රාමුවක් ස්වයංක්රීයව නැවත ලැබෙනු ඇත. පරාමිතියක් ලෙස ඔබට "drop = True" යැයි පැවසිය හැකිය reset_index()
. වෙනත් වචන වලින් කිවහොත්, එය කෙටි කළ හැකිය: b_is_two_dataframe = df.groupby('B').get_group('two').reset_index(drop=True)
ඔබට ද භාවිතා කළ හැකිය .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'])]]