यह निर्धारित करने के लिए कि पंडों के कॉलम में कोई विशेष मूल्य है या नहीं


156

मैं यह निर्धारित करने की कोशिश कर रहा हूं कि क्या पंडों के कॉलम में एक प्रविष्टि है जिसका कोई विशेष मूल्य है। मैंने इसके साथ करने की कोशिश की if x in df['id']। मुझे लगा कि यह काम कर रहा है, सिवाय जब मैंने इसे एक मूल्य खिलाया था जो मुझे पता था कि 43 in df['id']यह उस कॉलम में नहीं था जो अभी भी वापस आ गया है True। जब मैं लापता आईडी से मेल खाने वाली प्रविष्टियों वाले डेटा फ्रेम में सब्मिट करता हूं df[df['id'] == 43], तो जाहिर है, इसमें कोई एंट्री नहीं होती है। यदि पंडों के डेटा फ्रेम में एक कॉलम में एक विशेष मान है और मेरी वर्तमान पद्धति काम क्यों नहीं करती है, तो मैं कैसे निर्धारित करूं? (FYI करें, मुझे एक ही समस्या है जब मैं इस प्रश्न के उत्तर में कार्यान्वयन का उपयोग करता हूं )।

जवाबों:


183

in एक श्रृंखला की जाँच करता है कि क्या मूल्य सूचकांक में है:

In [11]: s = pd.Series(list('abc'))

In [12]: s
Out[12]: 
0    a
1    b
2    c
dtype: object

In [13]: 1 in s
Out[13]: True

In [14]: 'a' in s
Out[14]: False

एक विकल्प यह देखना है कि क्या यह अद्वितीय मूल्यों में है:

In [21]: s.unique()
Out[21]: array(['a', 'b', 'c'], dtype=object)

In [22]: 'a' in s.unique()
Out[22]: True

या एक अजगर सेट:

In [23]: set(s)
Out[23]: {'a', 'b', 'c'}

In [24]: 'a' in set(s)
Out[24]: True

जैसा कि @DSM द्वारा बताया गया है, यह अधिक कुशल हो सकता है (विशेषकर यदि आप इसे केवल एक मूल्य के लिए कर रहे हैं) सीधे मूल्यों में उपयोग करने के लिए:

In [31]: s.values
Out[31]: array(['a', 'b', 'c'], dtype=object)

In [32]: 'a' in s.values
Out[32]: True

2
मैं यह जानना नहीं चाहता कि क्या यह अद्वितीय रूप से आवश्यक है, मुख्य रूप से मैं जानना चाहता हूं कि क्या यह वहां है।
माइकल

24
मुझे लगता है कि 'a' in s.valuesलंबी सीरीज के लिए और तेज होना चाहिए।
DSM

4
@AndyHayden क्या आप जानते हैं, क्यों, 'a' in sपांडा श्रृंखला के मूल्यों के बजाय सूचकांक की जांच करना पसंद करते हैं? शब्दकोशों में वे चाबियों की जांच करते हैं, लेकिन एक पांडा श्रृंखला को एक सूची या सरणी की तरह अधिक व्यवहार करना चाहिए, नहीं?
लेई

3
पांडा 0.24.0 से शुरू, का उपयोग करना s.valuesऔर df.valuesअत्यधिक छूट है। देखें इस । इसके अलावा, s.valuesवास्तव में कुछ मामलों में बहुत धीमी है।
Qusai Alothman

1
@QusaiAlothman न .to_numpyया .arrayतो मैं पूरी तरह से यकीन है कि क्या विकल्प वे (मैंने पढ़ा नहीं है "सलाह बिल्कुल") की वकालत कर रहे हैं नहीं कर रहा हूँ, एक श्रृंखला पर उपलब्ध हैं। वास्तव में वे कह रहे हैं कि .values एक numpy सरणी, जैसे वापस नहीं कर सकते स्पष्ट करने के मामले में ... लेकिन यह है कि के रूप में ठीक inअभी भी काम अपेक्षा के अनुरूप (वास्तव में और अधिक कुशलता से है कि यह numpy सरणी समकक्ष है)
एंडी हेडन

27

आप pandas.Series.isin का उपयोग भी कर सकते हैं, हालांकि यह थोड़ा लंबा है 'a' in s.values:

In [2]: s = pd.Series(list('abc'))

In [3]: s
Out[3]: 
0    a
1    b
2    c
dtype: object

In [3]: s.isin(['a'])
Out[3]: 
0    True
1    False
2    False
dtype: bool

In [4]: s[s.isin(['a'])].empty
Out[4]: False

In [5]: s[s.isin(['z'])].empty
Out[5]: True

लेकिन यह दृष्टिकोण अधिक लचीला हो सकता है यदि आपको एक DataFrame ( DataFrame.isin देखें ) के लिए एक साथ कई मानों का मिलान करने की आवश्यकता है

>>> df = DataFrame({'A': [1, 2, 3], 'B': [1, 4, 7]})
>>> df.isin({'A': [1, 3], 'B': [4, 7, 12]})
       A      B
0   True  False  # Note that B didn't match 1 here.
1  False   True
2   True   True

आप DataFrame.any () फ़ंक्शन का उपयोग भी कर सकते हैं :s.isin(['a']).any()
thando

17
found = df[df['Column'].str.contains('Text_to_search')]
print(found.count())

found.count()इच्छा मैचों की संख्या में शामिल है

और अगर यह 0 है, तो इसका मतलब है कि कॉलम कॉलम में नहीं मिला था।


2
मेरे लिए काम किया, लेकिन मैंने गिनती पाने के लिए लेन (पाया) का इस्तेमाल किया
kztd

1
हां लेन (पाया गया) कुछ बेहतर विकल्प है।
शहीर अंसारी

1
इस दृष्टिकोण ने मेरे लिए काम किया लेकिन मुझे मापदंडों na=Falseऔर regex=Falseअपने उपयोग के मामले को शामिल करना था , जैसा कि यहाँ बताया गया है: pandas.pydata.org/pandas-docs/stable/reference/api/…
Mabyn

1
लेकिन string.contains एक विकल्प खोज करता है। Ex: यदि "head_hunter" नामक मान मौजूद है। Str.contains मैचों में "हेड" पास करना और ट्रू देता है जो कि गलत है।
कार्तिकेयन

@ कार्तिकेयन इसका गलत नहीं है। आपकी खोज के संदर्भ पर निर्भर करता है। क्या होगा यदि आप पते या उत्पाद के लिए खोज रहे हैं। आपको वर्णन फिट करने वाले सभी उत्पाद की आवश्यकता होगी।
शाहीर अंसारी

6

मैंने कुछ सरल परीक्षण किए:

In [10]: x = pd.Series(range(1000000))

In [13]: timeit 999999 in x.values
567 µs ± 25.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [15]: timeit x.isin([999999]).any()
9.54 ms ± 291 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [16]: timeit (x == 999999).any()
6.86 ms ± 107 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [17]: timeit 999999 in set(x)
79.8 ms ± 1.98 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [21]: timeit x.eq(999999).any()
7.03 ms ± 33.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [22]: timeit x.eq(9).any()
7.04 ms ± 60 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [24]: timeit 9 in x.values
666 µs ± 15.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

दिलचस्प बात यह है कि यदि आप 9 या 999999 को देखते हैं, तो ऐसा नहीं लगता कि ऐसा लगता है कि सिंटैक्स में इसका उपयोग करने में समान समय लगता है (बाइनरी खोज का उपयोग करना चाहिए)

In [24]: timeit 9 in x.values
666 µs ± 15.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [25]: timeit 9999 in x.values
647 µs ± 5.21 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [26]: timeit 999999 in x.values
642 µs ± 2.11 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [27]: timeit 99199 in x.values
644 µs ± 5.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [28]: timeit 1 in x.values
667 µs ± 20.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

लगता है कि x.values ​​का उपयोग करना सबसे तेज़ है, लेकिन शायद पंडों में अधिक सुरुचिपूर्ण तरीका है?


यदि आप सबसे छोटे से सबसे बड़े परिणाम के क्रम को बदलते हैं तो यह बहुत अच्छा होगा। अच्छा काम!
एसएमएस

4

या उपयोग Series.tolistया Series.any:

>>> s = pd.Series(list('abc'))
>>> s
0    a
1    b
2    c
dtype: object
>>> 'a' in s.tolist()
True
>>> (s=='a').any()
True

Series.tolistके बारे में एक सूची बनाता है Series, और दूसरे मैं बस Seriesएक नियमित रूप से एक बूलियन हो रहा है Series, तो जाँच अगर वहाँ Trueबूलियन में किसी भी एस रहे हैं Series



1

उपयोग

df[df['id']==x].index.tolist()

यदि xयह मौजूद है idतो यह उन सूचकांकों की सूची लौटा देगा जहां यह मौजूद है, अन्यथा यह एक खाली सूची देता है।



0

मान लीजिए कि आप डेटाफ्रेम जैसा दिखता है:

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

अब आप जांचना चाहते हैं कि फ़ाइल नाम "80900026941984" डेटाफ्रेम में मौजूद है या नहीं।

आप बस लिख सकते हैं:

if sum(df["filename"].astype("str").str.contains("80900026941984")) > 0:
    print("found")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.