[PYTHON] 팬더 시리즈 필터링 방법
PYTHON팬더 시리즈 필터링 방법
나는 groupby ( 'name')을 수행 한 후이 시리즈를 가지고 있고 다른 컬럼에 mean () 함수를 사용했다.
name
383 3.000000
663 1.000000
726 1.000000
737 9.000000
833 8.166667
아무도 1.000000 평균 값 행을 필터링하는 방법을 보여 주시겠습니까? 고마워요. 그리고 당신의 도움에 크게 감사드립니다.
해결법
-
==============================
1.
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
-
==============================
2.팬더 버전 0.18 이상에서 다음과 같이 시리즈를 필터링 할 수도 있습니다.
팬더 버전 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
-
==============================
3.이를 수행하는 가장 빠른 방법은 numpy를 사용하여 기본 배열을 조각으로 재구성하는 것입니다. 아래의 타이밍을 참조하십시오.
이를 수행하는 가장 빠른 방법은 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
순진한 타이밍
-
==============================
4.DACW가 지적한 것처럼 판다 0.18.1에는 메서드 체인을 개선하여 찾고있는 것을 매우 능숙하게 처리합니다.
DACW가 지적한 것처럼 판다 0.18.1에는 메서드 체인을 개선하여 찾고있는 것을 매우 능숙하게 처리합니다.
.where를 사용하는 대신 .loc 인덱서 또는 Series 인덱서 []에 함수를 전달하고 .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 클래스에서 지원됩니다.
-
==============================
5.또 다른 방법은 먼저 DataFrame으로 변환하고 쿼리 메서드를 사용하는 것입니다 (numexpr이 설치되었다고 가정).
또 다른 방법은 먼저 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")
-
==============================
6.체인 작업이 마음에 들면 압축 기능을 사용할 수도 있습니다.
체인 작업이 마음에 들면 압축 기능을 사용할 수도 있습니다.
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
-
==============================
7.내 경우에는 값이 문자의 튜플 인 팬더 시리즈가 있습니다.
내 경우에는 값이 문자의 튜플 인 팬더 시리즈가 있습니다.
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)
따라서 색인을 사용하여 시리즈를 필터링 할 수 있지만 필요한 색인을 만들려면 적용이 필요합니다. 내 조건은 "정확히 하나의 'H'가있는 모든 튜플을 찾는 것입니다.
series_of_tuples[series_of_tuples.apply(lambda x: x.count('H')==1)]
나는 그것이 chainable이 아니라는 것을 인정한다. 즉, series_of_tuples를 두 번 반복한다는 통지, 어떤 임시 시리즈를 변수에 저장해야 apply (...)를 호출 할 수있다).
부울 인덱스를 생성하기 위해 elementwise를 조작 할 수있는 다른 메소드 (.apply (...) 외에도)가있을 수 있습니다.
chainable 함수를 사용하는 많은 다른 답변들 (받아 들인 대답 포함) :
이들은 일련의 개별 값이 아닌 Series에 적용되는 호출 가능 객체 (lambdas)를 수용합니다!
그러므로 필자의 위의 조건 / callable / lambda를 .loc []과 같은 연결 가능한 함수와 함께 사용하려고 시도했을 때 일련의 튜플은 이상하게 행동했다.
series_of_tuples.loc[lambda x: x.count('H')==1]
오류를 생성합니다.
KeyError : '레벨 H는 이름 (없음)과 동일해야합니다.'
나는 매우 혼란 스러웠다. 그러나 내가 원한 것이 아닌 Series.count series_of_tuples.count (...) 함수를 사용하고있는 것처럼 보인다.
대체 데이터 구조가 더 좋을 수 있음을 인정합니다.
이렇게하면 일련의 문자열이 만들어집니다 (즉, 튜플을 연결하고 튜플의 문자를 단일 문자열에 조인하여)
series_of_tuples.apply(''.join)
그래서 나는 chainable Series.str.count를 사용할 수있다.
series_of_tuples.apply(''.join).str.count('H')==1
from https://stackoverflow.com/questions/28272137/pandas-how-to-filter-a-series by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서 다음 코드 예제와 같은 방사형 클러스터를 만들려면 어떻게해야합니까? (0) | 2018.10.25 |
---|---|
[PYTHON] 크로스 플랫폼 키로거 (0) | 2018.10.25 |
[PYTHON] Django에서 여러 이미지 업로드하기 (0) | 2018.10.25 |
[PYTHON] Google App Engine - 세션 가져 오기 (Python 2.7) (0) | 2018.10.25 |
[PYTHON] Google 애플 리케이션 로그인 django에 (0) | 2018.10.25 |