팬더 시리즈를 필터링하는 방법
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
'Development Tip' 카테고리의 다른 글
angularjs의 범위에 바인딩되지 않는 확인란 (0) | 2020.12.13 |
---|---|
PDF를 만드는 동안 마크 다운 페이지 나누기 (0) | 2020.12.13 |
다른 활성 Homebrew 프로세스가 이미 진행 중입니다. (0) | 2020.12.13 |
파이썬의 sscanf (0) | 2020.12.13 |
[UILabel copyWithZone :] : 인식 할 수없는 선택기가 인스턴스로 전송되었습니다. (0) | 2020.12.13 |