पायथन पंडों में दो मानों के बीच डेटाफ्रैम में पंक्तियों का चयन कैसे करें?


99

मैं एक DataFrame को संशोधित करने के dfलिए केवल उन पंक्तियों को शामिल करने की कोशिश कर रहा हूं जिनके लिए स्तंभ में मान closing_price99 और 101 के बीच हैं और नीचे दिए गए कोड के साथ ऐसा करने की कोशिश कर रहे हैं।

हालाँकि, मुझे त्रुटि मिलती है

ValueError: किसी श्रृंखला का सत्य मान अस्पष्ट है। A.empty, a.bool (), a.item (), a.any () या a.all () का उपयोग करें

और मैं सोच रहा हूं कि क्या लूप का उपयोग किए बिना ऐसा करने का कोई तरीका है।

df = df[(99 <= df['closing_price'] <= 101)]

यहाँ मुद्दा यह है कि आप एक स्केलर की तुलना एक सरणी से नहीं कर सकते हैं इसलिए त्रुटि, तुलना के लिए आपको बिटवाइज़ ऑपरेटरों का उपयोग करना होगा और ऑपरेटर पूर्वता के कारण उन्हें कोष्ठक में संलग्न करना होगा
EdChum

df.queryऔर pd.evalइस उपयोग के मामले के लिए अच्छा लगता है। pd.eval()कार्यों के परिवार, उनकी विशेषताओं और उपयोग के मामलों की जानकारी के लिए, कृपया pd.eval () का उपयोग करके पांडा में गतिशील अभिव्यक्ति मूल्यांकन पर जाएं ।
cs95

जवाबों:


103

()अस्पष्टता को दूर करने के लिए आपको अपने बूलियन वेक्टर को समूहित करना चाहिए ।

df = df[(df['closing_price'] >= 99) & (df['closing_price'] <= 101)]

162

इसके बीच की श्रृंखला पर भी विचार करें :

df = df[df['closing_price'].between(99, 101)]

5
विकल्प inclusive=Trueडिफ़ॉल्ट रूप से उपयोग किया जाता है between, इसलिए आप इस तरह से क्वेरी कर सकते हैंdf = df[df['closing_price'].between(99, 101)]
एंटोन एर्मकोव

3
यह सबसे अच्छा जवाब है! अच्छा काम!
PEBKAC

क्या पांडा के बीच "कार्यक्षमता" नहीं है? मुझे नहीं मिल रहा है।
dsugasa

2
@dsugasa, के साथ tilde ऑपरेटर का उपयोग करें between
परफिट

1
@dsugasa उदाdf = df[~df['closing_price'].between(99, 101)]
Jan33

22

एक अच्छा विकल्प है - क्वेरी () विधि का उपयोग करें :

In [58]: df = pd.DataFrame({'closing_price': np.random.randint(95, 105, 10)})

In [59]: df
Out[59]:
   closing_price
0            104
1             99
2             98
3             95
4            103
5            101
6            101
7             99
8             95
9             96

In [60]: df.query('99 <= closing_price <= 101')
Out[60]:
   closing_price
1             99
5            101
6            101
7             99

अद्यतन: टिप्पणी का उत्तर दे रहा है:

मुझे यहाँ सिंटैक्स पसंद है लेकिन एक्सप्रेशन के साथ संयोजन करने की कोशिश करते समय गिर गया; df.query('(mean + 2 *sd) <= closing_price <=(mean + 2 *sd)')

In [161]: qry = "(closing_price.mean() - 2*closing_price.std())" +\
     ...:       " <= closing_price <= " + \
     ...:       "(closing_price.mean() + 2*closing_price.std())"
     ...:

In [162]: df.query(qry)
Out[162]:
   closing_price
0             97
1            101
2             97
3             95
4            100
5             99
6            100
7            101
8             99
9             95

मुझे यहाँ सिंटैक्स पसंद है लेकिन एक्सप्रेशन के साथ संयोजन करने की कोशिश करते समय गिर गया; df.query ('(मतलब + 2 * sd) <= समापन_प्रश्न <= (मतलब + 2 * sd)')
मानचित्रण डोम

1
@ मैप्पडोस, क्या है meanऔर sd? क्या वे स्तंभ नाम हैं?
मैक्स

नहीं, वे गणनात्मक माध्य और मानक विचलन फ्लोट के रूप में संग्रहीत हैं
मानचित्रण डोम

@appapp, आप "संग्रहीत" कहने का क्या मतलब है?
16

@ मैप्पडोस, मैंने अपनी पोस्ट अपडेट की है - यह है कि आप क्या पूछ रहे थे?
मैक्सू

9

आप .between()विधि का उपयोग भी कर सकते हैं

emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv")

emp[emp["Salary"].between(60000, 61000)]

उत्पादन

यहां छवि विवरण दर्ज करें


6
newdf = df.query('closing_price.mean() <= closing_price <= closing_price.std()')

या

mean = closing_price.mean()
std = closing_price.std()

newdf = df.query('@mean <= closing_price <= @std')

3

यदि आप कई मानों और कई इनपुटों के साथ काम कर रहे हैं, तो आप इस तरह से एक एप्‍लिकेशन फ़ंक्शन भी सेट कर सकते हैं। इस मामले में कुछ स्थानों के साथ गिरने वाले जीपीएस स्थानों के लिए एक डेटाफ्रेम को छानना।

def filter_values(lat,lon):
    if abs(lat - 33.77) < .01 and abs(lon - -118.16) < .01:
        return True
    elif abs(lat - 37.79) < .01 and abs(lon - -122.39) < .01:
        return True
    else:
        return False


df = df[df.apply(lambda x: filter_values(x['lat'],x['lon']),axis=1)]

1

इसके अलावा

df = df[(99 <= df['closing_price'] <= 101)]

आपको इसका उपयोग करना चाहिए

df = df[(df['closing_price']>=99 ) & (df['closing_price']<=101)]

हमें क्वेरी कंपाउंडिंग के लिए NumPy के बिटवाइज़ लॉजिक ऑपरेटर्स |, &, ~, ^ का उपयोग करना होगा। इसके अलावा, कोष्ठक संचालक पूर्ववर्ती के लिए महत्वपूर्ण हैं।

अधिक जानकारी के लिए, आप लिंक पर जा सकते हैं: तुलना, मास्क और बूलियन लॉजिक

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