programing

시리즈물을 필터링하는 방법

megabox 2023. 7. 18. 21:38
반응형

시리즈물을 필터링하는 방법

저는 다른 열에서 groupby('name')와 mean() 함수를 사용한 후 이와 같은 시리즈를 가지고 있습니다.

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에서는 여러분이 찾고 있는 것을 매우 멋지게 수행하는 방법 체인 개선이 있습니다.

사용하기 보다는.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 클래스에서도 유사한 동작이 지원됩니다.

빠른 은 를위빠방다법은사음것재입는다니구하성용여하이을한른▁usingruct▁a다를 사용하여 재구성하는 입니다.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

순진한 타이밍

enter image description here

다른 방법은 먼저 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")

작업을 을,▁use다▁▁also를 사용할 수도 있습니다.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)]

나는 그것이 "사슬에 묶일 수" 없다는 것을 인정합니다. (즉, 반복합니다.)series_of_tuples변수에 적용(...)을 호출할 수 있도록 임시 영상 시리즈를 변수에 저장해야 합니다.

다른 방법도 있을 수 있습니다(그 외에도)..apply(...)요소별로 작동하여 부울 인덱스를 생성할 수 있습니다.

다음과 같은 체인 가능한 기능을 사용하는 다른 많은 답변(승인된 답변 포함):

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

이들은 시리즈의 개별 값이 아닌 시리즈에 적용되는 호출부(람다)를 허용합니다!

따라서 내 튜플 시리즈는 위의 조건 / 호출 가능 / 람다를 사용하려고 할 때 다음과 같은 체인 가능 함수는 다음과 같습니다..loc[]:

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

다음 오류가 발생합니다.

키 오류: '레벨 H는 이름(없음)과 같아야 합니다.'

저는 매우 혼란스러웠지만, Series.count 기능을 사용하고 있는 것 같은데, 이것은 제가 원했던 것이 아닙니다.

저는 대체 데이터 구조가 더 나을 수 있다는 것을 인정합니다.

  • 범주 데이터 유형?
  • 데이터 프레임(투플의 각 요소가 열이 됨)
  • 일련의 문자열(튜플을 연결하기만 하면 됨):

이는 일련의 문자열을 생성합니다(즉, 튜플을 연결하고 단일 문자열에 튜플의 문자를 결합함).

series_of_tuples.apply(''.join)

그럼 체인블을 사용할 수 있습니다.

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

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

반응형