Подтвердить что ты не робот

Как вы фильтруете pandas числовые кадры по нескольким столбцам

Чтобы фильтровать фрейм данных (df) одним столбцом, если мы рассматриваем данные с мужчинами и самками, мы можем:

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

Вопрос 1 - Но что, если данные охватывают несколько лет, и я хотел видеть только мужчин на 2014 год?

На других языках я могу сделать что-то вроде:

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

(за исключением того, что я хочу сделать это и получить подмножество исходного фрейма данных в новом объекте dataframe)

Вопрос 2. Как это сделать в цикле и создать объект dataframe для каждого уникального набора года и пола (например, df для: 2013-Male, 2013-Female, 2014-Male и 2014-Female

for y in year:

for g in gender:

df = .....
4b9b3361

Ответ 1

Используя оператор &, не забудьте обернуть подзапросы с помощью ():

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

Чтобы сохранить ваши данные в dict с помощью цикла for:

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

EDIT:

Демонстрация для вашего getDF:

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

print genDF(dic, 'male', 2014)

Ответ 2

Для более общих логических функций, которые вы хотели бы использовать в качестве фильтра и которые зависят от более чем одного столбца, вы можете использовать:

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

где f - это функция, которая применяется к каждой паре элементов (x1, x2) из ​​col_1 и col_2 и возвращает True или False в зависимости от любого условия, в котором вы хотите (x1, x2).

Ответ 3

Начните с панды 0.13, это самый эффективный способ.

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

Ответ 4

Вы можете фильтровать по нескольким столбцам (более двух), используя оператор 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]
})