Usando esto como punto de partida:
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
Out[8]:
one two three
0 10 1.2 4.2
1 15 70 0.03
2 8 5 0
Quiero usar algo como una if
declaración dentro de pandas.
if df['one'] >= df['two'] and df['one'] <= df['three']:
df['que'] = df['one']
Básicamente, verifique cada fila a través de la if
declaración, cree una nueva columna.
Los documentos dicen usar .all
pero no hay ejemplo ...
python
pandas
if-statement
dataframe
Esmerejón
fuente
fuente
if
declaración esFalse
?object
. Esto permite almacenar objetos de Python arbitrarios en la columna, pero tiene el costo de un cálculo numérico más lento. Por lo tanto, si la columna almacena datos numéricos, es preferible utilizar NaN para no números.a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
. Esto crea resultados confusos con el código "correcto":df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])]
cede10
la primera línea, mientras que debería cederNaN
si la entrada hubiera sido números enteros.Respuestas:
Podrías usar np.where . Si
cond
es una matriz booleana yA
yB
son matrices, entoncesdefine C como igual a
A
dondecond
es Verdadero yB
dondecond
es Falso.import numpy as np import pandas as pd a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']] df = pd.DataFrame(a, columns=['one', 'two', 'three']) df['que'] = np.where((df['one'] >= df['two']) & (df['one'] <= df['three']) , df['one'], np.nan)
rendimientos
one two three que 0 10 1.2 4.2 10 1 15 70 0.03 NaN 2 8 5 0 NaN
Si tiene más de una condición, puede usar np.select en su lugar. Por ejemplo, si desea
df['que']
igualardf['two']
cuándodf['one'] < df['two']
, entoncesconditions = [ (df['one'] >= df['two']) & (df['one'] <= df['three']), df['one'] < df['two']] choices = [df['one'], df['two']] df['que'] = np.select(conditions, choices, default=np.nan)
rendimientos
one two three que 0 10 1.2 4.2 10 1 15 70 0.03 70 2 8 5 0 NaN
Si podemos suponer que
df['one'] >= df['two']
whendf['one'] < df['two']
es False, entonces las condiciones y opciones podrían simplificarse aconditions = [ df['one'] < df['two'], df['one'] <= df['three']] choices = [df['two'], df['one']]
(La suposición puede no ser cierta si
df['one']
odf['two']
contiene NaN).Tenga en cuenta que
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']] df = pd.DataFrame(a, columns=['one', 'two', 'three'])
define un DataFrame con valores de cadena. Dado que parecen numéricos, es mejor que convierta esas cadenas en flotantes:
Sin embargo, esto cambia los resultados, ya que las cadenas comparan carácter por carácter, mientras que los flotantes se comparan numéricamente.
In [61]: '10' <= '4.2' Out[61]: True In [62]: 10 <= 4.2 Out[62]: False
fuente
Puede usarlo
.equals
para columnas o marcos de datos completos.df['col1'].equals(df['col2'])
Si son iguales, esa declaración volverá
True
, de lo contrarioFalse
.fuente
Podría usar apply () y hacer algo como esto
df['que'] = df.apply(lambda x : x['one'] if x['one'] >= x['two'] and x['one'] <= x['three'] else "", axis=1)
o si prefieres no usar una lambda
def que(x): if x['one'] >= x['two'] and x['one'] <= x['three']: return x['one'] return '' df['que'] = df.apply(que, axis=1)
fuente
Una forma es utilizar una serie booleana para indexar la columna
df['one']
. Esto le da una nueva columna donde lasTrue
entradas tienen el mismo valor que la misma filadf['one']
y losFalse
valores sonNaN
.La serie booleana solo la da su
if
declaración (aunque es necesario usar en&
lugar deand
):>>> df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])] >>> df one two three que 0 10 1.2 4.2 10 1 15 70 0.03 NaN 2 8 5 0 NaN
Si desea que los
NaN
valores sean reemplazados por otros valores, puede usar elfillna
método en la nueva columnaque
. He usado en0
lugar de la cadena vacía aquí:>>> df['que'] = df['que'].fillna(0) >>> df one two three que 0 10 1.2 4.2 10 1 15 70 0.03 0 2 8 5 0 0
fuente
Envuelva cada condición individual entre paréntesis y luego use el
&
operador para combinar las condiciones:df.loc[(df['one'] >= df['two']) & (df['one'] <= df['three']), 'que'] = df['one']
Puede completar las filas que no coinciden con solo usar
~
(el operador "no") para invertir la coincidencia:df.loc[~ ((df['one'] >= df['two']) & (df['one'] <= df['three'])), 'que'] = ''
Necesita usar
&
y en~
lugar deand
ynot
porque los operadores&
y~
trabajan elemento por elemento.El resultado final:
df Out[8]: one two three que 0 10 1.2 4.2 10 1 15 70 0.03 2 8 5 0
fuente
Úselo
np.select
si tiene varias condiciones para verificar desde el marco de datos y generar una opción específica en una columna diferenteconditions=[(condition1),(condition2)] choices=["choice1","chocie2"] df["new column"]=np.select=(condtion,choice,default=)
Nota: El número de condiciones y el número de opciones deben coincidir, repita el texto en la opción si tiene las mismas opciones para dos condiciones diferentes
fuente
Creo que lo más cercano a la intuición del OP es una declaración if en línea:
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three']))
fuente
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three'])) ^ SyntaxError: unexpected EOF while parsing