En utilisant ceci comme point de départ:
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
Je veux utiliser quelque chose comme une if
déclaration dans les pandas.
if df['one'] >= df['two'] and df['one'] <= df['three']:
df['que'] = df['one']
En gros, vérifiez chaque ligne via l' if
instruction, créez une nouvelle colonne.
La documentation dit à utiliser .all
mais il n'y a pas d'exemple ...
python
pandas
if-statement
dataframe
Merlin
la source
la source
if
déclaration estFalse
?object
. Cela permet de stocker des objets Python arbitraires dans la colonne, mais cela se fait au prix d'un calcul numérique plus lent. Ainsi, si la colonne stocke des données numériques, l'utilisation de NaN pour not-a-numbers est préférable.a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
. Cela crée des résultats confus avec du code "correct":df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])]
donne10
pour la première ligne, alors qu'il devrait produireNaN
si l'entrée aurait été des entiers.Réponses:
Vous pouvez utiliser np.where . Si
cond
est un tableau booléen, etA
etB
sont des tableaux, alorsdéfinit C comme étant égal à
A
oùcond
est True etB
oùcond
est False.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)
rendements
one two three que 0 10 1.2 4.2 10 1 15 70 0.03 NaN 2 8 5 0 NaN
Si vous avez plus d'une condition, vous pouvez utiliser np.select à la place. Par exemple, si vous souhaitez
df['que']
égalerdf['two']
quanddf['one'] < df['two']
, alorsconditions = [ (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)
rendements
one two three que 0 10 1.2 4.2 10 1 15 70 0.03 70 2 8 5 0 NaN
Si nous pouvons supposer que
df['one'] >= df['two']
whendf['one'] < df['two']
est False, alors les conditions et les choix pourraient être simplifiés àconditions = [ df['one'] < df['two'], df['one'] <= df['three']] choices = [df['two'], df['one']]
(L'hypothèse peut ne pas être vraie si
df['one']
oudf['two']
contiennent des NaN.)Notez que
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']] df = pd.DataFrame(a, columns=['one', 'two', 'three'])
définit un DataFrame avec des valeurs de chaîne. Puisqu'elles ont l'air numériques, vous feriez peut-être mieux de convertir ces chaînes en flottants:
Cela modifie les résultats, cependant, car les chaînes se comparent caractère par caractère, tandis que les flottants sont comparés numériquement.
In [61]: '10' <= '4.2' Out[61]: True In [62]: 10 <= 4.2 Out[62]: False
la source
Vous pouvez utiliser
.equals
pour des colonnes ou des dataframes entiers.df['col1'].equals(df['col2'])
S'ils sont égaux, cette déclaration sera renvoyée
True
, sinonFalse
.la source
Vous pouvez utiliser apply () et faire quelque chose comme ça
df['que'] = df.apply(lambda x : x['one'] if x['one'] >= x['two'] and x['one'] <= x['three'] else "", axis=1)
ou si vous préférez ne pas utiliser de 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)
la source
Une méthode consiste à utiliser une série booléenne pour indexer la colonne
df['one']
. Cela vous donne une nouvelle colonne où lesTrue
entrées ont la même valeur que la même lignedf['one']
et lesFalse
valeurs sontNaN
.La série booléenne est juste donnée par votre
if
instruction (bien qu'il soit nécessaire d'utiliser à la&
place 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 vous souhaitez que les
NaN
valeurs soient remplacées par d'autres valeurs, vous pouvez utiliser lafillna
méthode sur la nouvelle colonneque
. J'ai utilisé à la0
place de la chaîne vide ici:>>> 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
la source
Mettez chaque condition individuelle entre parenthèses, puis utilisez l'
&
opérateur pour combiner les conditions:df.loc[(df['one'] >= df['two']) & (df['one'] <= df['three']), 'que'] = df['one']
Vous pouvez remplir les lignes non correspondantes en utilisant simplement
~
(l'opérateur "non") pour inverser la correspondance:df.loc[~ ((df['one'] >= df['two']) & (df['one'] <= df['three'])), 'que'] = ''
Vous devez utiliser
&
et~
plutôt queand
etnot
car les opérateurs&
et~
fonctionnent élément par élément.Le résultat final:
df Out[8]: one two three que 0 10 1.2 4.2 10 1 15 70 0.03 2 8 5 0
la source
À utiliser
np.select
si vous avez plusieurs conditions à vérifier à partir de la trame de données et à afficher un choix spécifique dans une colonne différenteconditions=[(condition1),(condition2)] choices=["choice1","chocie2"] df["new column"]=np.select=(condtion,choice,default=)
Remarque: le nombre de conditions et le nombre de choix doivent correspondre, répétez le texte dans le choix si pour deux conditions différentes vous avez les mêmes choix
la source
Je pense que le plus proche de l'intuition de l'OP est une instruction if en ligne:
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three']))
la source
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three'])) ^ SyntaxError: unexpected EOF while parsing