programing

여러 열로 판다 데이터 프레임을 어떻게 필터링합니까?

showcode 2023. 6. 9. 22:11
반응형

여러 열로 판다 데이터 프레임을 어떻게 필터링합니까?

데이터 프레임(df)을 단일 열로 필터링하려면 남성과 여성이 있는 데이터를 고려하면 다음을 수행할 수 있습니다.

males = df[df[Gender]=='Male']

질문 1: 하지만 데이터가 여러 해에 걸쳐 있고 2014년에는 남성만 보기를 원했다면 어땠을까요?

다른 언어에서는 다음과 같은 작업을 수행할 수 있습니다.

if A = "Male" and if B = "2014" then 

(단, 이 작업을 수행하여 새 데이터 프레임 개체에서 원래 데이터 프레임의 하위 집합을 가져옵니다.)

질문 2: 각 고유한 연도 및 성별 집합(즉, 2013-남성, 2013-여성, 2014-남성 및 2014-여성)에 대해 데이터 프레임 개체를 생성하려면 어떻게 해야 합니까?

for y in year:

for g in gender:

df = .....

사용.&연산자, 하위 문을 다음과 같이 닫는 것을 잊지 마십시오.():

males = df[(df[Gender]=='Male') & (df[Year]==2014)]

데이터 프레임을 저장하려면 다음과 같이 하십시오.dictfor 루프 사용:

from collections import defaultdict
dic={}
for g in ['male', 'female']:
    dic[g]=defaultdict(dict)
    for y in [2013, 2014]:
        dic[g][y]=df[(df[Gender]==g) & (df[Year]==y)] #store the DataFrames to a dict of dict

사용자를 위한 데모getDF:

def getDF(dic, gender, year):
    return dic[gender][year]

print genDF(dic, 'male', 2014)

판다 0.13부터 시작해서, 이것이 가장 효율적인 방법입니다.

df.query('Gender=="Male" & Year=="2014" ')

누군가 필터링하는 더 빠른 방법이 무엇인지 궁금해하는 경우(승인된 답변 또는 @redreamality의 답변):

import pandas as pd
import numpy as np

length = 100_000
df = pd.DataFrame()
df['Year'] = np.random.randint(1950, 2019, size=length)
df['Gender'] = np.random.choice(['Male', 'Female'], length)

%timeit df.query('Gender=="Male" & Year=="2014" ')
%timeit df[(df['Gender']=='Male') & (df['Year']==2014)]

100,000개 행에 대한 결과:

6.67 ms ± 557 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
5.54 ms ± 536 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

10,000,000개 행에 대한 결과:

326 ms ± 6.52 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
472 ms ± 25.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

따라서 결과는 크기와 데이터에 따라 달라집니다.내 노트북에.query()500k 행 이후에 속도가 빨라집니다.추가로, 문자열 검색은Year=="2014"불필요한 오버헤드가 있습니다(Year==2014더 빠름).

필터로 사용하고 둘 이상의 열에 의존하는 보다 일반적인 부울 함수의 경우 다음을 사용할 수 있습니다.

df = df[df[['col_1','col_2']].apply(lambda x: f(*x), axis=1)]

여기서 f는 col_1 및 col_2의 모든 요소 쌍(x1, x2)에 적용되고 원하는 조건(x1, x2)에 따라 True 또는 False를 반환하는 함수입니다.

기본적으로 Column_ 조건을 충족하는 행을 찾고 있기 때문입니다.A='값_A' 및 열_B='값_B'

사용할 수 있습니다.loc

df = df.loc[df['Column_A'].eq('Value_A') & df['Column_B'].eq('Value_B')]

당신은 여기서 완전한 의사를 찾을 수 있습니다 판다 loc.

다음을 사용하여 자체 필터 함수를 만들 수 있습니다.querypandas다음의 필터링이 있습니다.df모두의 결과kwargs매개 변수일부 검증자를 추가하는 것을 잊지 마십시오.kwargs필터링) 자신의 필터 기능을 가져옵니다.df.

def filter(df, **kwargs):
    query_list = []
    for key in kwargs.keys():
        query_list.append(f'{key}=="{kwargs[key]}"')
    query = ' & '.join(query_list)
    return df.query(query)

를 사용하여 여러 열(두 개 이상)로 필터링할 수 있습니다.np.logical_and대체할 연산자&(또는)np.logical_or대체할|)

다음은 여러 필드에 대상 값을 제공하는 경우 작업을 수행하는 함수의 예입니다.다양한 유형의 필터링에 맞게 조정할 수 있습니다.

def filter_df(df, filter_values):
    """Filter df by matching targets for multiple columns.

    Args:
        df (pd.DataFrame): dataframe
        filter_values (None or dict): Dictionary of the form:
                `{<field>: <target_values_list>}`
            used to filter columns data.
    """
    import numpy as np
    if filter_values is None or not filter_values:
        return df
    return df[
        np.logical_and.reduce([
            df[column].isin(target_values) 
            for column, target_values in filter_values.items()
        ])
    ]

용도:

df = pd.DataFrame({'a': [1, 2, 3, 4], 'b': [1, 2, 3, 4]})

filter_df(df, {
    'a': [1, 2, 3],
    'b': [1, 2, 4]
})

Alex 답변에 대한 개선 사항

def df_filter(df, **kwargs):
    query_list = []
    for key, value in kwargs.items():
        if value is not None:
            query_list.append(f"{key}==@kwargs['{str(key)}']")
    query = ' & '.join(query_list)
    return df.query(query)

없음 값을 제거하여 일부 값이 없음으로 기본 설정된 함수에 직접 삽입할 수 있습니다. 또한 값이 문자열이 아니면 이전 값이 작동하지 않습니다. 이는 모든 유형의 인수에서 작동합니다.

몇 년 후에 저는 이 질문으로 돌아와서 다른 해결책을 제안할 수 있습니다. 필터가 많이 포함되어 있을 때 특히 유용합니다.여러 필터링 마스크를 생성한 다음 이러한 필터에서 작동할 수 있습니다.

>>> df = pd.DataFrame({'gender': ['Male', 'Female', 'Male'],
...                    'married': [True, False, False]})
>>> gender_mask = df['gender'] == 'Male'
>>> married_mask = df['married']
>>> filtered_df = df.loc[gender_mask & married_mask]
>>> filtered_df
  gender  married
0   Male     True

가장 짧은 해결책은 아닐 수도 있지만, 읽을 수 있고 코드를 구성하는 데 큰 도움이 될 수 있습니다.

데이터 프레임에는 25개의 열이 있으며, 향후에는 어떤 종류의 필터(파라미터 수, 조건)도 자유롭게 선택할 수 있습니다.사용자:

    
deflex_module(파라미터):
res = load_dataframe()유형(파라미터)이 목록에 없는 경우:
반환 없음포렐 in params:
res = res.쿼리(f"{el[0]} {el[1]} {el[2]})"리턴 레스

그리고 이것을 부르는 것:

res = flex_query(['DATE','==','2022-09-26',['LEVEL','>=',2',['PERCENC',','10.2])

여기서 'DATE', 'LEVEL', 'PERCENC' - 열 이름.보시는 바와 같이 여러 매개 변수와 다양한 조건 유형을 가진 매우 유연한 쿼리 방법이 있습니다.이 방법을 사용하면 int, float, string - 'all in one'을 비교할 수 있습니다.

언급URL : https://stackoverflow.com/questions/22086116/how-do-you-filter-pandas-dataframes-by-multiple-columns

반응형