পান্ডস একটি সিরিজ ফিল্টার কিভাবে


94

গ্রুপবাই ('নাম') করার পরে এবং অন্য কলামে ব্যবহৃত গড় () ফাংশন করার পরে আমার এর মতো সিরিজ রয়েছে

name
383      3.000000
663      1.000000
726      1.000000
737      9.000000
833      8.166667

কেউ দয়া করে আমাকে কীভাবে 1.000000 গড় মানগুলি সহ সারিগুলি ফিল্টার করবেন তা আমাকে দেখাতে পারেন? আপনাকে ধন্যবাদ এবং আমি আপনার সাহায্যের প্রশংসা করি।


ঠিক আছে, আপনি একটি প্রদত্ত শর্তে কীভাবে একটি সিরিজ ফিল্টার করবেন?

উত্তর:


127
In [5]:

import pandas as pd

test = {
383:    3.000000,
663:    1.000000,
726:    1.000000,
737:    9.000000,
833:    8.166667
}

s = pd.Series(test)
s = s[s != 1]
s
Out[0]:
383    3.000000
737    9.000000
833    8.166667
dtype: float64

10
আমি নীচের উত্তরগুলিকে পছন্দ করি কারণ সেগুলিতে শৃঙ্খলাবদ্ধ হতে পারে (অর্থাত্ সংজ্ঞাটি দেওয়ার প্রয়োজন হবে না sএবং তারপরে এটি প্রকাশের ক্ষেত্রে দু'বার ব্যবহার করতে হবে)। যদিও পান্ডা থেকে 0.18 কাজ করে।
ইয়ানস

পিআইআরস্কয়ার্ডের উত্তরে টাইমিংয়ের তুলনাও দেখুন ।
ইয়ানস

63

পান্ডাস সংস্করণ থেকে 0.18+ সিরিজ ফিল্টারিং নীচের মতও করা যেতে পারে

test = {
383:    3.000000,
663:    1.000000,
726:    1.000000,
737:    9.000000,
833:    8.166667
}

pd.Series(test).where(lambda x : x!=1).dropna()

চেকআউট: http://pandas.pydata.org/pandas-docs/version/0.18.1/whatnew.html# মেমোড- শাইনিং- উন্নতি


4
পদ্ধতি শৃঙ্খলাবদ্ধকরণের সাথে এত সুন্দর (এবং আমাকে স্পার্কের কথা মনে করিয়ে দেয়))
ডিলান হগ

সত্য তবে স্পার্ক এক্ষেত্রে আরও স্বজ্ঞাত কিছু করেছে: এটি কেবল সারিগুলি থেকে মুক্তি পেয়ে যায় যা ভবিষ্যদ্বাণীটির সাথে মেলে না, তার অর্থ ".prodna ()" অংশটি ব্যবহার না করা যা আমার কাছে ডকটি না পড়ার আগে পর্যন্ত স্পষ্টতই অতিরিক্ত প্রয়োজন বলে মনে হয়েছিল। এর দ্বারা কামড়েছি: ডি
ফ্লোরেন্ট মইনি

44

যেমন ড্যাকডাব্লু নির্দেশ করেছে , পান্ডায় 0.18.1 -এ পদ্ধতি-শৃঙ্খলা সংক্রান্ত উন্নতি রয়েছে যা আপনি খুব সুন্দরভাবে যা খুঁজছেন তা করে।

ব্যবহারের পরিবর্তে .where, আপনি আপনার ফাংশনটিকে সূচক .locবা সিরিজ সূচক বা অন্যটিতে []যেতে পারেন এবং কলটি এড়াতে পারবেন .dropna:

test = pd.Series({
383:    3.000000,
663:    1.000000,
726:    1.000000,
737:    9.000000,
833:    8.166667
})

test.loc[lambda x : x!=1]

test[lambda x: x!=1]

ডেটাফ্রেম এবং এনডিফ্রেম ক্লাসে অনুরূপ আচরণ সমর্থিত।


4
এটি আমার প্রিয় উত্তর, এবং এটি অদ্ভুত নীচে না গিয়েও দ্রুততম বলে মনে হয় (সময়ের তুলনা দেখুন)।
ইয়ানস

21

এটি করার একটি দ্রুত উপায় হ'ল numpyঅন্তর্নিহিত অ্যারেগুলি স্লাইস করে পুনর্গঠন করা । নীচে সময় দেখুন।

mask = s.values != 1
pd.Series(s.values[mask], s.index[mask])

0
383    3.000000
737    9.000000
833    8.166667
dtype: float64

নিষ্পাপ সময়

এখানে চিত্র বর্ণনা লিখুন


Your আমি আপনার পদ্ধতিটি পছন্দ করি, আমি জানতে চাই যদি আমার মাল্টি-মাস্ক থাকে। থেক্স
মেনগলং লি

4
@ মেংলংলি নির্ভর করে, আপনার একটি প্রশ্ন করা উচিত। সম্ভবত, আপনি এগুলিকে & এর সাথে একত্রিত করতেন। মাস্ক = মাস্ক 1 এবং মাস্ক 2
পিআরআর 14

6

আরেকটি উপায় হ'ল প্রথমে একটি ডেটা ফ্রেমে রূপান্তর করা এবং ক্যোয়ারী পদ্ধতিটি ব্যবহার করা (ধরে নেওয়া উচিত যে আপনি নিউমেক্সপ্র ইনস্টল করেছেন):

import pandas as pd

test = {
383:    3.000000,
663:    1.000000,
726:    1.000000,
737:    9.000000,
833:    8.166667
}

s = pd.Series(test)
s.to_frame(name='x').query("x != 1")

আমি মনে করি না যে শর্তটি স্ট্রিং হিসাবে পাস করা ভাল ধারণা
সাইমনপাজের্ট

4
এটি ডেটাফ্রেমের সমস্ত ওভারহেড যুক্ত করে এবং খুব ধীর হতে চলেছে।
চমত্কার

5

আপনি যদি শৃঙ্খলিত ক্রিয়াকলাপ পছন্দ করেন তবে আপনি compressফাংশনটিও ব্যবহার করতে পারেন :

test = pd.Series({
383:    3.000000,
663:    1.000000,
726:    1.000000,
737:    9.000000,
833:    8.166667
})

test.compress(lambda x: x != 1)

# 383    3.000000
# 737    9.000000
# 833    8.166667
# dtype: float64

1

আমার ক্ষেত্রে আমার কাছে একটি পান্ডা সিরিজ ছিল যেখানে মানগুলি অক্ষরের আকার :

Out[67]
0    (H, H, H, H)
1    (H, H, H, T)
2    (H, H, T, H)
3    (H, H, T, T)
4    (H, T, H, H)

অতএব আমি সিরিজটি ফিল্টার করতে সূচি ব্যবহার করতে পারি, তবে আমার প্রয়োজনীয় সূচক তৈরি করতে apply। আমার অবস্থা "এমন সমস্ত টিপল সন্ধান করুন যার ঠিক এক 'এইচ' রয়েছে"।

series_of_tuples[series_of_tuples.apply(lambda x: x.count('H')==1)]

আমি স্বীকার করি এটি "চেইনযোগ্য" নয় , (অর্থাত্ আমি series_of_tuplesদু'বার পুনরাবৃত্তি করবো ; আপনার অবশ্যই কোনও অস্থায়ী সিরিজটি ভেরিয়েবলের মধ্যে সংরক্ষণ করতে হবে যাতে আপনি এটিতে প্রয়োগ (...) বলতে পারেন)।

বুলিয়ান সূচক তৈরির জন্য এলিমেন্টওয়াইজ পরিচালনা করতে পারে এমন অন্যান্য পদ্ধতি (পাশাপাশি .apply(...)) থাকতে পারে।

আরও অনেক উত্তর (স্বীকৃত উত্তর সহ) শৃঙ্খলাবদ্ধ ফাংশনগুলি ব্যবহার করে যেমন:

  • .compress()
  • .where()
  • .loc[]
  • []

এগুলি কলগুলি (ল্যাম্বডাস) গ্রহণ করে যা সিরিজগুলিতে প্রয়োগ করা হয় , সেই সিরিজের স্বতন্ত্র মানগুলিতে নয় !

অতএব যখন আমার উপরের শর্তটি / কলযোগ্য / ল্যাম্বদা ব্যবহার করার চেষ্টা করলাম তখন আমার শৃঙ্খলাগুলির সিরিজটি অদ্ভুতভাবে আচরণ করেছিল, যেমন কোনও চেইনযোগ্য ফাংশন যেমন .loc[]:

series_of_tuples.loc[lambda x: x.count('H')==1]

ত্রুটি উত্পাদন করে:

কী-এরর: 'লেভেল এইচ অবশ্যই নামের মতো হতে হবে (কিছুই নয়)'

আমি খুব বিভ্রান্ত হয়ে পড়েছিলাম তবে মনে হচ্ছে এটি সিরিজ.কাউন্ট series_of_tuples.count(...)ফাংশনটি ব্যবহার করছে যা আমি যা চাইছিলাম তা নয়।

আমি স্বীকার করি যে একটি বিকল্প ডেটা কাঠামো আরও ভাল হতে পারে:

  • একটি বিভাগ ডেটাটাইপ?
  • একটি ডেটাফ্রেম (টিপলের প্রতিটি উপাদান কলামে পরিণত হয়)
  • স্ট্রিংগুলির একটি সিরিজ (কেবল একসাথে টিউপসকে একত্রিত করে):

এটি স্ট্রিংগুলির একটি সিরিজ তৈরি করে (অর্থাত্ টুপলকে একত্রিত করে; একক স্ট্রিংতে টিপলটিতে অক্ষরগুলিতে যোগদান করা)

series_of_tuples.apply(''.join)

সুতরাং আমি তারপর শৃঙ্খলযোগ্য ব্যবহার করতে পারেনSeries.str.count

series_of_tuples.apply(''.join).str.count('H')==1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.