web-dev-qa-db-fra.com

Pandas dataframe ajouter un champ basé sur plusieurs instructions if

Je suis assez nouveau pour Python et Pandas donc cela pourrait être une question évidente.

J'ai une trame de données avec des âges répertoriés. Je veux créer un nouveau champ avec une tranche d'âge. Je peux utiliser l'instruction lambda pour capturer une seule instruction if/else mais je veux utiliser plusieurs if par exemple if age < 18 then 'under 18' Elif age < 40 then 'under 40' else '>40'.

Je ne pense pas que je puisse le faire en utilisant lambda mais je ne sais pas comment le faire d'une manière différente. J'ai ce code jusqu'à présent:

import pandas as pd
import numpy as n

d = {'Age' : pd.Series([36., 42., 6., 66., 38.]) }

df = pd.DataFrame(d)

df['Age_Group'] =  df['Age'].map(lambda x: '<18' if x < 19 else '>18')

print(df)
32
user3302483

Le pandas DataFrame fournit une belle capacité d'interrogation.

Ce que vous essayez de faire peut se faire simplement avec:

# Set a default value
df['Age_Group'] = '<40'
# Set Age_Group value for all row indexes which Age are greater than 40
df['Age_Group'][df['Age'] > 40] = '>40'
# Set Age_Group value for all row indexes which Age are greater than 18 and < 40
df['Age_Group'][(df['Age'] > 18) & (df['Age'] < 40)] = '>18'
# Set Age_Group value for all row indexes which Age are less than 18
df['Age_Group'][df['Age'] < 18] = '<18'

L'interrogation ici est un outil puissant de la trame de données et vous permettra de manipuler la DataFrame selon vos besoins.

Pour les conditions plus complexes, vous pouvez spécifier plusieurs conditions en encapsulant chaque condition entre parenthèses et en les séparant avec un opérateur booléen (par exemple, '&' ou '|')

Vous pouvez le voir dans le travail ici pour la deuxième instruction conditionnelle pour la définition> 18.

Modifier:

Vous pouvez en savoir plus sur l'indexation de DataFrame et des conditions:

http://pandas.pydata.org/pandas-docs/dev/indexing.html#index-objects

Modifier:

Pour voir comment cela fonctionne:

>>> d = {'Age' : pd.Series([36., 42., 6., 66., 38.]) }
>>> df = pd.DataFrame(d)
>>> df
   Age
0   36
1   42
2    6
3   66
4   38
>>> df['Age_Group'] = '<40'
>>> df['Age_Group'][df['Age'] > 40] = '>40'
>>> df['Age_Group'][(df['Age'] > 18) & (df['Age'] < 40)] = '>18'
>>> df['Age_Group'][df['Age'] < 18] = '<18'
>>> df
   Age Age_Group
0   36       >18
1   42       >40
2    6       <18
3   66       >40
4   38       >18

Modifier:

Pour voir comment faire cela sans le chaînage [en utilisant l'approche EdChums].

>>> df['Age_Group'] = '<40'
>>> df.loc[df['Age'] < 40,'Age_Group'] = '<40'
>>> df.loc[(df['Age'] > 18) & (df['Age'] < 40), 'Age_Group'] = '>18'
>>> df.loc[df['Age'] < 18,'Age_Group'] = '<18'
>>> df
   Age Age_Group
0   36       >18
1   42       <40
2    6       <18
3   66       <40
4   38       >18
54
Ryan G

Vous pouvez également faire un np.where imbriqué ()

df['Age_group'] = np.where(df.Age<18, 'under 18',
                           np.where(df.Age<40,'under 40', '>40'))
10
S.Zuo