পান্ডাস কলামে একটি নির্দিষ্ট মান রয়েছে কিনা তা কীভাবে নির্ধারণ করবেন


156

আমি কোনও পান্ডাস কলামে একটি নির্দিষ্ট মান আছে যা এন্ট্রি আছে কিনা তা নির্ধারণ করার চেষ্টা করছি। আমি এটি দিয়ে চেষ্টা করার চেষ্টা করেছি if x in df['id']। আমি ভেবেছিলাম এটি কাজ করছে, যখনই আমি এটিকে এমন কোনও মান খাওয়াতাম যেটি আমি জানতাম যে কলামটি 43 in df['id']এখনও তা ফিরে আসেনি True। আমি যখন কোনও ডেটা ফ্রেমে সাবসেট করি তবে কেবল অনুপস্থিত আইডির সাথে মিল থাকা এন্ট্রিগুলি df[df['id'] == 43]থাকে, স্পষ্টতই, এতে কোনও প্রবেশিকা থাকে না। পান্ডস ডেটা ফ্রেমের কোনও কলামে একটি নির্দিষ্ট মান রয়েছে এবং আমার বর্তমান পদ্ধতিটি কেন কাজ করে না তা আমি কীভাবে নির্ধারণ করব? (এফওয়াইআই, আমি যখন একই অনুরূপ প্রশ্নের উত্তরটিতে বাস্তবায়নটি ব্যবহার করি তখন আমারও একই সমস্যা হয় )।

উত্তর:


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

@ ডিএসএম দ্বারা নির্দেশিত হিসাবে, কেবলমাত্র মানগুলিতে সরাসরি ব্যবহার করার জন্য এটি আরও কার্যকর হতে পারে (বিশেষত যদি আপনি কেবল একটি মূল্যের জন্য এটি করছেন):

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দীর্ঘ সিরিজের জন্য দ্রুত হওয়া উচিত।
ডিএসএম 21

4
@ অ্যান্ডি হেডেন আপনি কী জানেন যে কেন 'a' in sপ্যান্ডাস সিরিজের মানগুলির চেয়ে সূচি পরীক্ষা করতে পছন্দ করে? অভিধানগুলিতে তারা কীগুলি পরীক্ষা করে, তবে একটি পান্ডাস সিরিজের আরও একটি তালিকা বা অ্যারের মতো আচরণ করা উচিত, না?
লেই

3
0.24.0 প্যান্ডাস থেকে শুরু করে ব্যবহার করে s.valuesএবং df.valuesঅত্যন্ত ডিসকোর্সড। এই দেখুন । এছাড়াও, s.valuesকিছু ক্ষেত্রে আসলে অনেক ধীর।
কুসাই অ্যালথম্যান

1
@QusaiAlothman তন্ন তন্ন .to_numpyবা .arrayতাই আমি সম্পূর্ণরূপে নিশ্চিত কি বিকল্প তারা (আমি পড়া না "অত্যন্ত নিরুৎসাহিত") সমর্থনে করছি নই, সিরিজ উপলব্ধ। প্রকৃতপক্ষে তারা বলছেন যে। মূল্যবোধগুলি একটি অদ্ভুত অ্যারে ফিরিয়ে দিতে পারে না, উদাহরণস্বরূপ একটি শ্রেণিবদ্ধের ক্ষেত্রে ... তবে এটি inএখনও ঠিক হিসাবে প্রত্যাশিত হিসাবে কাজ করবে (সত্যিই আরও দক্ষতার সাথে এটি অদ্ভুত অ্যারের সমকক্ষ)
অ্যান্ডি হেডেন

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

আপনি যদি ডেটাফ্রেমের জন্য একবারে একাধিক মানের মান মেলে প্রয়োজন হয় তবে এই পদ্ধতিটি আরও নমনীয় হতে পারে ( ডাটাফ্রেম.আইসিন দেখুন )

>>> 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/references/api/…
ম্যাবিন

1
তবে স্ট্রিং.কন্টেনগুলি একটি স্ট্রিং অনুসন্ধান করে। উদা: "হেড_হান্টার" নামক একটি মান উপস্থিত থাকলে। টিআর.আর.কে "হেড" পাস করার সাথে ম্যাচ হয় এবং সত্য দেয় যা ভুল।
কার্তিক্যয়ন

পছন্দ করুন আপনার অনুসন্ধানের প্রসঙ্গে নির্ভর করে। আপনি যদি ঠিকানা বা পণ্য সন্ধান করছেন What আপনার বিবরণ মাপসই এমন সমস্ত পণ্য প্রয়োজন।
শাহির আনসারি

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")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.