DataFrame
पायथन पंडों में कुछ कॉलम में मूल्यों के आधार पर पंक्तियों का चयन कैसे करें ?
SQL में, मैं उपयोग करूंगा:
SELECT *
FROM table
WHERE colume_name = some_value
मैंने पंडों के प्रलेखन को देखने की कोशिश की, लेकिन तुरंत जवाब नहीं मिला।
DataFrame
पायथन पंडों में कुछ कॉलम में मूल्यों के आधार पर पंक्तियों का चयन कैसे करें ?
SQL में, मैं उपयोग करूंगा:
SELECT *
FROM table
WHERE colume_name = some_value
मैंने पंडों के प्रलेखन को देखने की कोशिश की, लेकिन तुरंत जवाब नहीं मिला।
जवाबों:
उन पंक्तियों का चयन करने के लिए जिनका स्तंभ मान एक स्केलर के बराबर है 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
df.where(condition)
, तो स्थिति के समान आकार होना चाहिए df
।
df[df['column_name'] == some_value]
काम करता है, हमें .loc
यहां जोड़ने की आवश्यकता क्यों है ?
पांडा डेटा फ़्रेम से पंक्तियों का चयन करने के कई तरीके हैं:
df[df['col'] == value
))df.iloc[...]
)df.xs(...)
)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})
... बूलियन इंडेक्सिंग के लिए प्रत्येक पंक्ति के '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
हम डेटा फ्रेम को भी फिर से संगठित कर सकते थे। डेटाफ़्रेम का पुनर्निर्माण करते समय एक बड़ा चेतावनी है - ऐसा करते समय आपको ध्यान रखना चाहिए 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(..))
इस योजना में तुलना कैसे होगी ? ii) क्या आप कई शर्तों का उपयोग करते समय रैंकिंग की उम्मीद करेंगे?
[{P|EXP}TIME]
- और [{C|P|EXP}SPACE]
- जब एक बार बढ़ने पर संपूर्ण डेटाफ़्रेम (ऊपर-नीचे प्रसंस्करण करना) कुछ पंक्ति में गिना जाता है? हमें पूरी तस्वीर दिखाने के लिए धन्यवाद, सर। क्वांटिटेटिव बेंचमार्क रीडिंग हमेशा स्वागत योग्य है, क्योंकि दोनों और मान बैच की राहत के साथ होते हैं । ~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
लेकिन उस बिंदु पर मैं क्वेरी फ़ंक्शन का उपयोग करने की सिफारिश करूंगा , क्योंकि यह कम क्रिया है और समान परिणाम देता है:
df.query('foo == 222 | bar == 444')
query
यहाँ केवल एक ही उत्तर है जो विधि के साथ संगत है। ऐसा लगता है कि यह filter
डंपर्स में पंडों का एनालॉग है ।
[
चाहिए (
जो बाहर की ओर गोल कोष्ठक नहीं हैं ।
|
यह AND के लिए था, लेकिन निश्चित रूप से यह
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
पैंडास विधियों और यहां तक कि कॉलम नामों के साथ डेटाफ्रेम को फ़िल्टर करने के लिए विधि का उपयोग कर सकते हैं जिनमें रिक्त स्थान हैं। आम तौर पर कॉलम नामों में रिक्त स्थान एक त्रुटि देते हैं, लेकिन अब हम यह हल कर सकते हैं कि बैकटिक (`) का उपयोग करके देखें 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
संख्यात्मक परिणाम का उपयोग करके तेज़ परिणाम प्राप्त किए जा सकते हैं ।
उदाहरण के लिए, अनबंटू के सेटअप के साथ -
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()
स्वचालित रूप से एक डेटाफ्रेम वापस आ जाएगा। इसके अलावा आप बस "ड्रॉप = ट्रू" को एक पैरामीटर के रूप में कह सकते हैं 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
परिणाम @unutbu द्वारा वर्णित के रूप में उपयोग करने के समान है
df[[df['B'].isin(['one','three'])]]