как фильтровать фреймы данных pandas по нескольким столбцам
чтобы отфильтровать фрейм данных (df) по одному столбцу, если мы рассмотрим данные с мужчинами и женщинами, мы можем:
males = df[df[Gender]=='Male']
Вопрос 1-но что, если данные охватывали несколько лет, и я хотел видеть только мужчин за 2014 год?
на других языках я мог бы сделать что-то вроде:
if A = "Male" and if B = "2014" then
(за исключением того, что я хочу сделать это и получить подмножество исходного фрейма данных в новом объекте dataframe)
Вопрос 2. Как мне сделать это в цикле, и создать объект dataframe для каждого уникального набора года и пола (т. е. df для: 2013-мужчина, 2013-женщина, 2014-мужчина и 2014-женщина
for y in year:
for g in gender:
df = .....
2 ответов:
используя
&оператор, не забудьте обернуть вложенные операторы с():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 dictEDIT:
демо для вашего
getDF:def getDF(dic, gender, year): return dic[gender][year] print genDF(dic, 'male', 2014)
для более общих булевых функций, которые вы хотели бы использовать в качестве фильтра и которые зависят от более чем одного столбца, вы можете использовать:
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).
Comments