Как вы фильтруете 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 = .....
Ответы
Ответ 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]
})