it-swarm.com.de

Pandas dataframe fügt ein Feld hinzu, das auf mehreren if-Anweisungen basiert

Ich bin ein Neuling in Python und Pandas, daher könnte dies eine naheliegende Frage sein.

Ich habe einen Datenrahmen, in dem das Alter angegeben ist. Ich möchte ein neues Feld mit einer Altersangabe erstellen. Ich kann die Lambda-Anweisung verwenden, um eine einzelne if/else-Anweisung zu erfassen, aber ich möchte mehrere ifs verwenden, z. if age < 18 then 'under 18' Elif age < 40 then 'under 40' else '>40'.

Ich glaube nicht, dass ich das mit Lambda machen kann, bin mir aber nicht sicher, wie ich es anders machen soll. Ich habe diesen Code bisher:

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

Der pandas DataFrame bietet eine nützliche Abfragefunktion.

Was Sie versuchen zu tun, können Sie ganz einfach tun mit:

# 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'

Die Abfrage hier ist ein leistungsstarkes Tool des Datenrahmens und ermöglicht es Ihnen, den Datenrahmen nach Bedarf zu bearbeiten.

Bei komplexeren Bedingungen können Sie mehrere Bedingungen angeben, indem Sie jede Bedingung in Klammern einschließen und mit einem booleschen Operator (z. B. '&' oder '|') trennen.

Sie können dies in der Arbeit hier für die zweite bedingte Anweisung für die Einstellung> 18 sehen.

Bearbeiten:

Sie können mehr über die Indizierung von DataFrame und Bedingungen lesen:

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

Bearbeiten:

Um zu sehen, wie es funktioniert:

>>> 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

Bearbeiten:

Hier erfahren Sie, wie Sie dies ohne Verkettung tun können [unter Verwendung des EdChums-Ansatzes].

>>> 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

Sie können auch ein verschachteltes np.where () ausführen.

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