J'ai un dataframe binairy et je voudrais vérifier si toutes les valeurs d'une ligne spécifique ont la valeur 1. Par exemple, j'ai sous le dataframe. Puisque la ligne 0 et la ligne 2 contiennent toutes la valeur 1 dans col1 à col3, le résultat devrait être 1, si ce n'est pas le cas, il devrait être 0.
def similar(x):
if x['col1'] == 1 and x['col2'] == 1 and x['col3'] == 1:
return 1
else:
''
df['outcome'] = df.apply(similar, axis=1)
Puisque ma propre base de données est beaucoup plus grande, je cherche pour une manière plus élégante que la suivante, des pensées?
import pandas as pd
d = {'col1': [1, 0,1,0], 'col2': [1, 0,1, 1], 'col3': [1,0,1,1], 'outcome': [1,0,1,0]}
df = pd.DataFrame(data=d)
3 Réponses :
Essayez plutôt ceci:
df['outcome'] = df.apply(lambda x: 1 if df['col1']==1 and df['col2']==1 and df['col3']==1 else '', axis=1)
Un cas classique de tous .
df['outcome'] = (df.iloc[:,:-1] == 1).all(1).astype(int)
col1 col2 col3 outcome
0 1 1 1 1
1 0 0 0 0
2 1 1 1 1
3 0 1 1 0
que faire si j'ai une valeur différente de 1 dans mes colonnes. une chaîne peut-être ou un booléen ?.
True et False sont équivalents à 1 et 0 en Python, donc bool n'est pas un problème. Si vous avez des chaînes, vous pouvez les convertir en int (avec astype ) `
Ceci est plus générique et fonctionne également pour toute autre valeur. Remplacez simplement le deuxième == 1 par == .
df['outcome'] = 0
df.loc[df.loc[(df.iloc[:,:-1].nunique(axis=1) == 1) \
& (df.iloc[:,:-1] == 1).all(axis=1)].index, 'outcome'] = 1