Development Tip

팬더 시리즈를 필터링하는 방법

yourdevel 2020. 12. 13. 11:14
반응형

팬더 시리즈를 필터링하는 방법


groupby ( 'name')을 수행하고 다른 열에서 mean () 함수를 사용한 후 이와 같은 Series가 있습니다.

name
383      3.000000
663      1.000000
726      1.000000
737      9.000000
833      8.166667

누구든지 1.000000 평균 값으로 행을 필터링하는 방법을 보여 주시겠습니까? 감사합니다. 도움을 주셔서 대단히 감사합니다.


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

팬더 버전 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/whatsnew.html#method-chaininng-improvements


으로 DACW 지적 , 거기 메소드 체인 개선 당신은 매우 친절 찾고있는 무엇 팬더 0.18.1에가.

를 사용하는 대신 인덱서 또는 Series 인덱서에 .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]

유사한 동작이 DataFrame 및 NDFrame 클래스에서 지원됩니다.


이를 수행하는 빠른 방법은 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

순진한 타이밍

여기에 이미지 설명 입력


또 다른 방법은 먼저 DataFrame으로 변환하고 쿼리 메서드를 사용하는 것입니다 (numexpr이 설치되어 있다고 가정).

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")

연결 작업이 마음에 들면 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

제 경우 에는 값이 문자의 튜플 인 팬더 시리즈가 있습니다 .

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. 내 조건은 "정확히 하나의 'H'를 가진 모든 튜플 찾기"입니다.

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

I admit it is not "chainable", (i.e. notice I repeat series_of_tuples twice; you must store any temporary series into a variable so you can call apply(...) on it).

There may also be other methods (besides .apply(...)) which can operate elementwise to produce a Boolean index.

Many other answers (including accepted answer) using the chainable functions like:

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

These accept callables (lambdas) which are applied to the Series, not to the individual values in those series!

Therefore my Series of tuples behaved strangely when I tried to use my above condition / callable / lambda, with any of the chainable functions, like .loc[]:

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

Produces the error:

KeyError: 'Level H must be same as name (None)'

나는 매우 혼란 스러웠지만series_of_tuples.count(...) 내가 원하는 것이 아닌 Series.count 함수를 사용하는 것 같습니다 .

대체 데이터 구조가 더 좋을 수 있음을 인정합니다.

  • 카테고리 데이터 유형?
  • Dataframe (튜플의 각 요소가 열이 됨)
  • 일련의 문자열 (튜플을 함께 연결) :

이것은 일련의 문자열을 생성합니다 (즉, 튜플을 연결하여 단일 문자열에서 튜플의 문자를 결합).

series_of_tuples.apply(''.join)

그래서 체인 블 을 사용할 수 있습니다.Series.str.count

series_of_tuples.apply(''.join).str.count('H')==1

참고 URL : https://stackoverflow.com/questions/28272137/pandas-how-to-filter-a-series

반응형