как фильтровать фреймы данных 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 = .....
850   2  

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 dict

EDIT:

демо для вашего 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

    Ничего не найдено.