web-dev-qa-db-fra.com

comment filtrez-vous pandas images de plusieurs colonnes)

Pour filtrer une base de données (df) en une seule colonne, si nous considérons des données avec des hommes et des femmes, nous pourrions:

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

Question 1 - Mais que se passe-t-il si les données couvrent plusieurs années et que je ne souhaite voir que des hommes en 2014?

Dans d'autres langues, je pourrais faire quelque chose comme:

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

(sauf que je veux faire cela et obtenir un sous-ensemble de la trame de données d'origine dans un nouvel objet dataframe)

Question 2. Comment faire cela dans une boucle et créer un objet dataframe pour chaque série unique d’années et de genres (c.-à-d. Un df pour: 2013-Homme, 2013-Femme, 2014-Homme et 2014-Femme

for y in year:

for g in gender:

df = .....
71
yoshiserry

En utilisant & opérateur, n’oubliez pas d’envelopper les sous-instructions avec ():

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

Pour stocker vos images dans un dict en utilisant une boucle 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

MODIFIER:

Une démo pour votre getDF:

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

print genDF(dic, 'male', 2014)
119
zhangxaochen

Pour les fonctions booléennes plus générales que vous souhaitez utiliser en tant que filtre et qui dépendent de plusieurs colonnes, vous pouvez utiliser:

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

où f est une fonction qui est appliquée à chaque paire d'éléments (x1, x2) à partir de col_1 et col_2 et renvoie True ou False selon la condition que vous voulez (x1, x2).

20
guibor

Commencez par Pandas 0,1 , c'est le moyen le plus efficace.

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