একটি সিরিজের সত্য মান অস্পষ্ট। A.empty, a.bool (), a.item (), a.ny () বা a.all () ব্যবহার করুন


366

শর্তের সাথে আমার ফলাফলের ডেটা ফ্রেম ফিল্টার করার সমস্যা হচ্ছে or। আমি আমার ফলাফলটি 0.25 এর উপরে এবং -0.25 এর নীচে থাকা dfসমস্ত কলামের varমানগুলি বের করতে চাই।

নীচে এই যুক্তিটি আমাকে একটি দ্ব্যর্থহীন সত্যের মান দেয় তবে আমি যখন এই ফিল্টারিংটিকে দুটি পৃথক ক্রিয়ায় বিভক্ত করি তখন এটি কাজ করে। এখানে কি হচ্ছে? প্রস্তাবিত কোথায় ব্যবহার করবেন তা নিশ্চিত নন a.empty(), a.bool(), a.item(),a.any() or a.all()

 result = result[(result['var']>0.25) or (result['var']<-0.25)]

46
এর |পরিবর্তেor
ম্যাকসু

1
এখানে একটি abs(result['var'])>0.25
কার্যকারিতা রয়েছে

1
সম্পর্কিত:
পান্ডাসে

উত্তর:


565

orএবং andপাইথন বিবৃতি প্রয়োজন truth-values। জন্য pandasএই দ্ব্যর্থক বলে মনে করা হয় তাই আপনি ব্যবহার করা উচিত "bitwise" |(অথবা) অথবা &(এবং) অপারেশন:

result = result[(result['var']>0.25) | (result['var']<-0.25)]

উপাদান-ভিত্তিক or(বা and) উত্পাদনের জন্য এগুলি এই জাতীয় ডেটাস্ট্রাকচারের জন্য ওভারলোড হয় ।


এই বিবৃতিতে আরও কিছু ব্যাখ্যা যুক্ত করতে:

আপনি যখন এটি পেতে চান তখন ব্যতিক্রম নিক্ষেপ boolকরা হয় pandas.Series:

>>> import pandas as pd
>>> x = pd.Series([1])
>>> bool(x)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

কি তোমাকে আঘাত একটি জায়গা যেখানে অপারেটর ছিল পরোক্ষভাবে করার operands রূপান্তরিত bool(আপনি ব্যবহার orকিন্তু এটি ঘটে and, ifএবং while):

>>> x or x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> x and x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> if x:
...     print('fun')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> while x:
...     print('fun')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

এই 4 বিবৃতি ছাড়াও বেশ কিছু পাইথন ফাংশন যে কিছু লুকাতে হয় boolকল (যেমন any, all, filter, ...) কিন্তু সচরাচর তা না দিয়ে সমস্যাযুক্ত হয় pandas.Seriesকিন্তু সম্পূর্ণতার জন্য আমি এই উল্লেখ করতে চেয়েছিলেন।


আপনার ক্ষেত্রে ব্যতিক্রমটি সত্যই সহায়ক নয়, কারণ এটি সঠিক বিকল্পগুলির উল্লেখ করে না । জন্য andএবং orআপনি ব্যবহার করতে পারেন (যদি আপনি উপাদান-অনুযায়ী তুলনা চান):

  • numpy.logical_or:

    >>> import numpy as np
    >>> np.logical_or(x, y)

    বা কেবল |অপারেটর:

    >>> x | y
  • numpy.logical_and:

    >>> np.logical_and(x, y)

    বা কেবল &অপারেটর:

    >>> x & y

আপনি যদি অপারেটরগুলি ব্যবহার করে থাকেন তবে অপারেটর প্রাধান্যের কারণে আপনি নিজের বন্ধনীটি সঠিকভাবে সেট করেছেন তা নিশ্চিত করুন ।

এখানে বেশ কয়েকটি লজিকাল নম্পী ফাংশন রয়েছে যা কাজ করা উচিতpandas.Series


ব্যতিক্রম বর্ণিত বিকল্পগুলি আরও উপযুক্ত হয় যদি আপনি এটি করার সময় ifবা এর মুখোমুখি হন while। আমি শীঘ্রই এর প্রতিটি ব্যাখ্যা করব:

  • আপনার সিরিজ খালি কিনা তা যদি আপনি পরীক্ষা করতে চান :

    >>> x = pd.Series([])
    >>> x.empty
    True
    >>> x = pd.Series([1])
    >>> x.empty
    False

    পাইথন স্বাভাবিকভাবে ব্যাখ্যা করে len(যেমন পাত্রে GTH list, tuple, ...) হিসাবে সত্য-মান যদি এটা কোন স্পষ্ট বুলিয়ান ব্যাখ্যা হয়েছে। সুতরাং আপনি যদি অজগর মত চেক চান, আপনি করতে পারেন: if x.sizeবা if not x.emptyপরিবর্তে if x

  • আপনার যদি Seriesরয়েছে এক এবং একমাত্র এক বুলিয়ান মান:

    >>> x = pd.Series([100])
    >>> (x > 50).bool()
    True
    >>> (x < 50).bool()
    False
  • আপনি যদি নিজের সিরিজের প্রথম এবং একমাত্র আইটেমটি চেক করতে চান (যেমন .bool()তবে বুুলিয়ান সামগ্রীগুলির জন্যও কাজ করে):

    >>> x = pd.Series([100])
    >>> x.item()
    100
  • যদি আপনি যাচাই করতে চান যে সমস্ত বা কোনও আইটেম শূন্য নয়, খালি নয় বা মিথ্যা নয়:

    >>> x = pd.Series([0, 1, 2])
    >>> x.all()   # because one element is zero
    False
    >>> x.any()   # because one (or more) elements are non-zero
    True

এই পাইথন অপারেটরগুলি পান্ডাস সিরিজ পরিচালনা করতে ওভারলোড হয় না কেন?
মুদিত জৈন

@MuditJain সরাসরি জমিদার করার কোনো উপায় নেই and, orএবং notপাইথন হবে। এই boolঅপারেটরগুলি অপারেন্ডসের রিটার্নে যা সরাসরি ব্যবহার করে। এবং একটি উপায়ে পান্ডা / নুমপি ওভারলোড হয়েছে যে এটি ইতিমধ্যে উত্থাপন করেছে ValueErrorকারণ তারা এই জাতীয় ডেটা কাঠামোর সত্য-মান বিবেচনা করে না।
এমসিফার্ট

সমাধানটি ঠিক আছে, তবে ব্যাখ্যাটি ভাল নয়
ব্ল্যাকশিপ

2
@ ব্ল্যাকশিপ আমি কী আরও ভালভাবে ব্যাখ্যা করতে পারলাম আপনার কাছে কি কোনও পরামর্শ আছে?
এমেসিফার্ট

এটি একটি দুর্দান্ত ব্যাখ্যা। এটি আমাকে বিটওয়াইস বনাম লজিকাল এমনভাবে বুঝতে সহায়তা করেছিল যাতে আরও বিমূর্ত উদাহরণগুলি করতে ব্যর্থ হয়।
rkesNwaves

41

বুলিয়ান যুক্তি জন্য, ব্যবহার করুন &এবং |

np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC'))

>>> df
          A         B         C
0  1.764052  0.400157  0.978738
1  2.240893  1.867558 -0.977278
2  0.950088 -0.151357 -0.103219
3  0.410599  0.144044  1.454274
4  0.761038  0.121675  0.443863

>>> df.loc[(df.C > 0.25) | (df.C < -0.25)]
          A         B         C
0  1.764052  0.400157  0.978738
1  2.240893  1.867558 -0.977278
3  0.410599  0.144044  1.454274
4  0.761038  0.121675  0.443863

কী ঘটছে তা দেখতে আপনি প্রতিটি তুলনার জন্য বুলিয়ানগুলির একটি কলাম পাবেন

df.C > 0.25
0     True
1    False
2    False
3     True
4     True
Name: C, dtype: bool

যখন আপনার একাধিক মানদণ্ড রয়েছে, আপনি একাধিক কলাম ফেরত পাবেন। এজন্য যোগদানের যুক্তিটি দ্ব্যর্থক। প্রতিটি কলাম আলাদাভাবে ব্যবহার andবা orআচরণ করে, তাই আপনাকে প্রথমে সেই কলামটি একক বুলিয়ান মানকে কমিয়ে আনা দরকার। উদাহরণস্বরূপ, প্রতিটি কলামে কোনও মান বা সমস্ত মান সত্য কিনা তা দেখতে।

# Any value in either column is True?
(df.C > 0.25).any() or (df.C < -0.25).any()
True

# All values in either column is True?
(df.C > 0.25).all() or (df.C < -0.25).all()
False

একই জিনিসটি অর্জনের একটি বিভ্রান্ত উপায় হ'ল এই সমস্ত কলামকে এক সাথে জিপ করা, এবং উপযুক্ত যুক্তি সম্পাদন করা।

>>> df[[any([a, b]) for a, b in zip(df.C > 0.25, df.C < -0.25)]]
          A         B         C
0  1.764052  0.400157  0.978738
1  2.240893  1.867558 -0.977278
3  0.410599  0.144044  1.454274
4  0.761038  0.121675  0.443863

আরও বিশদের জন্য ডক্সে বুলিয়ান সূচীকরণ দেখুন


20

ভাল পান্ডারা বিটওয়াইজ 'ও' '|' ব্যবহার করে এবং প্রতিটি শর্ত একটি '()' এ আবৃত করা উচিত

উদাহরণস্বরূপ নিম্নলিখিত কাজ

data_query = data[(data['year'] >= 2005) & (data['year'] <= 2010)]

তবে সঠিক বন্ধনী ছাড়া একই ক্যোয়ারি করে না

data_query = data[(data['year'] >= 2005 & data['year'] <= 2010)]

8

অথবা, বিকল্পভাবে, আপনি অপারেটর মডিউলটি ব্যবহার করতে পারেন। আরও বিস্তারিত তথ্য পাইথন ডক্স এখানে

import operator
import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC'))
df.loc[operator.or_(df.C > 0.25, df.C < -0.25)]

          A         B         C
0  1.764052  0.400157  0.978738
1  2.240893  1.867558 -0.977278
3  0.410599  0.144044  1.454274
4  0.761038  0.121675  0.4438

1

এই দুর্দান্ত উত্তরটি যা ঘটছে তা খুব ভালভাবে ব্যাখ্যা করে এবং একটি সমাধান সরবরাহ করে। আমি অনুরূপ ক্ষেত্রে উপযুক্ত হতে পারে এমন আরও একটি সমাধান যুক্ত করতে চাই: queryপদ্ধতিটি ব্যবহার করে :

result = result.query("(var > 0.25) or (var < -0.25)")

Http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-query এও দেখুন ।

(আমি বর্তমানে যে ডেটাফ্রেমের সাথে কাজ করছি তার সাথে কিছু পরীক্ষা পরামর্শ দেয় যে বুলিয়ান্সের সিরিজে বিটওয়াইস অপারেটরগুলি ব্যবহার করার চেয়ে এই পদ্ধতিটি কিছুটা ধীরগতির: 2 এমএস বনাম 870 ডিগ্রি)

সতর্কতার একটি অংশ : কলামের নামগুলি পাইথন এক্সপ্রেশন হওয়ার পরে কমপক্ষে একটি পরিস্থিতি যেখানে এটি সোজা নয় is আমি কলাম নামে ছিল WT_38hph_IP_2, WT_38hph_input_2এবং log2(WT_38hph_IP_2/WT_38hph_input_2)এবং নিচের ক্যোয়ারীর কার্য সম্পাদনা করতে চেয়েছিলাম:"(log2(WT_38hph_IP_2/WT_38hph_input_2) > 1) and (WT_38hph_IP_2 > 20)"

আমি নিম্নলিখিত ব্যতিক্রম ক্যাসকেড পেয়েছি:

  • KeyError: 'log2'
  • UndefinedVariableError: name 'log2' is not defined
  • ValueError: "log2" is not a supported function

আমার ধারণা এটি ঘটেছে কারণ ক্যোয়ারী পার্সার তৃতীয় কলামের নাম দিয়ে অভিব্যক্তি চিহ্নিত করার পরিবর্তে প্রথম দুটি কলাম থেকে কিছু করার চেষ্টা করছিল।

এখানে একটি সম্ভাব্য কাজের প্রস্তাব করা হয়েছে


1

আমি একই ত্রুটির মুখোমুখি হয়েছি এবং কিছুদিনের জন্য একটি পাইপর্ক ডেটা ফ্রেমের সাথে স্থবির হয়ে পড়েছি, আমি 2 টি ক্ষেত্রের থেকে পূর্ণসংখ্যার মানের তুলনা করার কারণে 0 এর সাথে না মানগুলি পূরণ করে এটি সফলভাবে সমাধান করতে সক্ষম হয়েছি।

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