열의 값이 값 집합 목록에 있는 경우 데이터 프레임 행 필터링
Python Panda Data Frame을 가지고 있습니다.rpt
:
rpt
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 47518 entries, ('000002', '20120331') to ('603366', '20091231')
Data columns:
STK_ID 47518 non-null values
STK_Name 47518 non-null values
RPT_Date 47518 non-null values
sales 47518 non-null values
재고 ID가 다음과 같은 행을 필터링할 수 있습니다.'600809'
다음과 같습니다.rpt[rpt['STK_ID'] == '600809']
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 25 entries, ('600809', '20120331') to ('600809', '20060331')
Data columns:
STK_ID 25 non-null values
STK_Name 25 non-null values
RPT_Date 25 non-null values
sales 25 non-null values
그리고 나는 다음과 같은 주식의 모든 열을 모으고 싶다.['600809','600141','600329']
즉, 다음과 같은 구문이 필요합니다.
stk_list = ['600809','600141','600329']
rst = rpt[rpt['STK_ID'] in stk_list] # this does not works in pandas
판다들은 위의 명령을 받아들이지 않기 때문에, 어떻게 목표를 달성할 것인가?
를 사용합니다.isin
방법:
rpt[rpt['STK_ID'].isin(stk_list)]
isin()
는 완전일치 리스트가 있는 경우 이상적이지만 부분일치 리스트 또는 서브스트링 리스트가 있는 경우 메서드와 정규 표현을 사용하여 필터링할 수 있습니다.
예를 들어, 데이터 프레임을 반환할 경우 모든 재고 ID가 다음 문자로 시작됩니다.'600'
그 다음에, 다음의 3 자리수가 됩니다.
>>> rpt[rpt['STK_ID'].str.contains(r'^600[0-9]{3}$')] # ^ means start of string
... STK_ID ... # [0-9]{3} means any three digits
... '600809' ... # $ means end of string
... '600141' ...
... '600329' ...
... ... ...
값을 입력할 문자열 목록이 있다고 가정합니다.'STK_ID'
마지막으로 예를 들어,
endstrings = ['01$', '02$', '05$']
이러한 문자열을 정규식 'or' 문자와 결합할 수 있습니다.|
끈을 넘겨주고str.contains
데이터 프레임을 필터링하려면:
>>> rpt[rpt['STK_ID'].str.contains('|'.join(endstrings)]
... STK_ID ...
... '155905' ...
... '633101' ...
... '210302' ...
... ... ...
마침내.contains
(설정에 따라) 대소문자를 무시할 수 있습니다.case=False
)를 사용하면 대조할 문자열을 지정할 때 보다 일반적인 내용을 알 수 있습니다.
예를들면,
str.contains('pandas', case=False)
일치할 것이다PANDAS
,PanDAs
,paNdAs123
기타 등등.
다음을 사용하여 범위를 사용할 수도 있습니다.
b = df[(df['a'] > 1) & (df['a'] < 5)]
또한 DataFrame에 직접 문의하여 이 정보를 확인할 수도 있습니다.
rpt.query('STK_ID in (600809,600141,600329)')
또는 마찬가지로 범위를 검색합니다.
rpt.query('60000 < STK_ID < 70000')
판다와 함께 데이터 슬라이스
다음과 같은 데이터 프레임이 지정됩니다.
RPT_Date STK_ID STK_Name sales
0 1980-01-01 0 Arthur 0
1 1980-01-02 1 Beate 4
2 1980-01-03 2 Cecil 2
3 1980-01-04 3 Dana 8
4 1980-01-05 4 Eric 4
5 1980-01-06 5 Fidel 5
6 1980-01-07 6 George 4
7 1980-01-08 7 Hans 7
8 1980-01-09 8 Ingrid 7
9 1980-01-10 9 Jones 4
데이터를 선택하거나 슬라이스하는 방법은 여러 가지가 있습니다.
.isin 사용
가장 확실한 것은.isin
특징.마스크는 만들 수 있습니다.True
/False
다음과 같이 데이터 프레임에 적용할 수 있습니다.
mask = df['STK_ID'].isin([4, 2, 6])
mask
0 False
1 False
2 True
3 False
4 True
5 False
6 True
7 False
8 False
9 False
Name: STK_ID, dtype: bool
df[mask]
RPT_Date STK_ID STK_Name sales
2 1980-01-03 2 Cecil 2
4 1980-01-05 4 Eric 4
6 1980-01-07 6 George 4
마스킹은 이 문제에 대한 임시 해결책이지만 속도와 메모리 측면에서 항상 좋은 성능을 발휘하는 것은 아닙니다.
인덱싱 사용
인덱스를 로 설정함으로써STK_ID
기둥, 우리는 팬더에 내장된 슬라이싱 오브젝트를 사용할 수 있다..loc
df.set_index('STK_ID', inplace=True)
RPT_Date STK_Name sales
STK_ID
0 1980-01-01 Arthur 0
1 1980-01-02 Beate 4
2 1980-01-03 Cecil 2
3 1980-01-04 Dana 8
4 1980-01-05 Eric 4
5 1980-01-06 Fidel 5
6 1980-01-07 George 4
7 1980-01-08 Hans 7
8 1980-01-09 Ingrid 7
9 1980-01-10 Jones 4
df.loc[[4, 2, 6]]
RPT_Date STK_Name sales
STK_ID
4 1980-01-05 Eric 4
2 1980-01-03 Cecil 2
6 1980-01-07 George 4
이렇게 하면 인덱싱에 시간이 조금 걸리더라도 이렇게 여러 쿼리를 수행할 경우 시간을 절약할 수 있습니다.
데이터 프레임 병합
이 작업은 데이터 프레임을 병합하여 수행할 수도 있습니다.이러한 예보다 데이터가 훨씬 많은 시나리오에 적합합니다.
stkid_df = pd.DataFrame({"STK_ID": [4,2,6]})
df.merge(stkid_df, on='STK_ID')
STK_ID RPT_Date STK_Name sales
0 2 1980-01-03 Cecil 2
1 4 1980-01-05 Eric 4
2 6 1980-01-07 George 4
메모
위의 모든 방법은 동일한 행이 여러 개 있는 경우에도 작동합니다.'STK_ID'
또한 'query'와 @: 를 사용하여 유사한 결과를 얻을 수 있습니다.
예:
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'f']})
df = pd.DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3, 5]})
list_of_values = [3,6]
result= df.query("A in @list_of_values")
result
A B
1 6 2
2 3 3
사용할 수 있습니다.query
(예:
b = df.query('a > 1 & a < 5')
언급URL : https://stackoverflow.com/questions/12065885/filter-dataframe-rows-if-value-in-column-is-in-a-set-list-of-values
'programing' 카테고리의 다른 글
JQuery - $가 정의되지 않았습니다. (0) | 2022.10.26 |
---|---|
Python Maria DB 구문 (0) | 2022.10.26 |
Laravel passport: 수동으로 액세스 토큰 생성 (0) | 2022.10.26 |
JavaScript를 사용하여 줄바꿈 문자를 포함하는 JSON 문자열을 이스케이프하려면 어떻게 해야 합니까? (0) | 2022.10.26 |
지정한 DSN에 드라이버와 응용 프로그램 간의 아키텍처가 일치하지 않습니다.자바 (0) | 2022.10.26 |