Tengo un DataFrame que se parece a esto:
| Age | Married | OwnsHouse |
| 23 | True | False |
| 35 | True | True |
| 14 | False | False |
| 27 | True | True |
Quiero encontrar la edad más alta de cualquiera que esté casado y sea dueño de una casa. La respuesta aquí sería 35. Mi primer pensamiento fue hacer:
df_subset = df[df['Married'] == True and df['OwnsHouse'] == True]
max_age = df_subset.max()
Sin embargo, el conjunto de datos es grande (50 MB) y me temo que será computacionalmente costoso ya que pasa por el conjunto de datos dos veces.
Mi segundo pensamiento fue hacer:
max_age = 0
for index, row in df.iterrows():
if(row[index]['Married] and row['index']['OwnsHouse'] and row[index]['Age] > max_age):
max_age = row[index]['Age']
¿Existe una forma más rápida de hacer esto?
Su primer enfoque es sólido, pero aquí hay una opción simple:
df[df['Married'] & df['OwnsHouse']].max()
Age 35.0
Married 1.0
OwnsHouse 1.0
dtype: float64
O solo la edad:
df.loc[df['Married'] & df['OwnsHouse'], 'Age'].max()
# 35
Si tiene varias columnas booleanas, sugeriría algo un poco más escalable,
df[df[['Married', 'OwnsHouse']].all(axis=1)].max()
Age 35.0
Married 1.0
OwnsHouse 1.0
dtype: float64
Dónde,
df[['Married', 'OwnsHouse']].all(axis=1)
0 False
1 True
2 False
3 True
dtype: bool
Que es lo mismo que,
df['Married'] & df['OwnsHouse']
0 False
1 True
2 False
3 True
dtype: bool
Pero en lugar de buscar manualmente el AND de N máscaras booleanas, .all
hazlo por ti.
query
es otra opción:
df.query("Married and OwnsHouse")['Age'].max()
# 35
No requiere un paso intermedio para calcular una máscara.
Su método es lo suficientemente rápido, pero si desea microoptimizar, aquí hay algunas opciones más con numpy:
# <= 0.23
df[(df['Married'].values & df['OwnsHouse'].values)].max()
df[df[['Married', 'OwnsHouse']].values.all(axis=1)].max()
# 0.24+
df[(df['Married'].to_numpy() & df['OwnsHouse'].to_numpy())].max()
df[df[['Married', 'OwnsHouse']].to_numpy().all(axis=1)].max()
Age 35.0
Married 1.0
OwnsHouse 1.0
dtype: float64
Aunque probablemente quieras solo la edad. Hacer esto
df.loc[(df['Married'].to_numpy() & df['OwnsHouse'].to_numpy()), 'Age'].max()
# 35
Si te apetece más numpy, haz esto:
df.loc[(
df['Married'].to_numpy() & df['OwnsHouse'].to_numpy()), 'Age'
].to_numpy().max()
# 35
O mejor aún, tira a los pandas,
df['Age'].to_numpy()[df['Married'].to_numpy() & df['OwnsHouse'].to_numpy()].max()
# 35
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras