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 ifdeclaració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 ifdeclaración, cree una nueva columna.
Los documentos dicen usar .allpero no hay ejemplo ...
python
pandas
if-statement
dataframe
Esmerejón
fuente
fuente

ifdeclaració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'])]cede10la primera línea, mientras que debería cederNaNsi la entrada hubiera sido números enteros.Respuestas:
Podrías usar np.where . Si
condes una matriz booleana yAyBson matrices, entoncesdefine C como igual a
Adondecondes Verdadero yBdondecondes 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 NaNSi 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 NaNSi 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]: Falsefuente
Puede usarlo
.equalspara 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 lasTrueentradas tienen el mismo valor que la misma filadf['one']y losFalsevalores sonNaN.La serie booleana solo la da su
ifdeclaració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 NaNSi desea que los
NaNvalores sean reemplazados por otros valores, puede usar elfillnamétodo en la nueva columnaque. He usado en0lugar 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 0fuente
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 deandynotporque 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 0fuente
Úselo
np.selectsi 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