J'ai une question assez simple basée sur cet exemple de code:
x1 = 10*np.random.randn(10,3) df1 = pd.DataFrame(x1)
Je recherche un DataFrame unique dérivé de df1 où les valeurs positives sont remplacées par "up" , les valeurs négatives sont remplacées par "down" et les valeurs 0 , le cas échéant, sont remplacées par "zéro" . J'ai essayé d'utiliser les méthodes .where () et .mask () mais je n'ai pas pu obtenir le résultat souhaité.
J'ai vu d'autres articles qui filtrer en fonction de plusieurs conditions à la fois, mais ils n'indiquent pas comment remplacer des valeurs selon différentes conditions.
4 Réponses :
0 1 2 0 down up up 1 up down down 2 up down down 3 down down up 4 down down up 5 down up up 6 down up down 7 up down down 8 up up down 9 down up up
En général, vous pouvez utiliser np.select sur les valeurs et reconstruire le DataFrame
0 1 2 0 zero down up 1 up down up 2 up up up 3 down down down 4 up up up 5 up up up 6 up up down 7 up up down 8 down up down 9 up up down
import pandas as pd
import numpy as np
df1 = pd.DataFrame(10*np.random.randn(10, 3))
df1.iloc[0, 0] = 0 # So we can check the == 0 condition
conds = [df1.values < 0 , df1.values > 0]
choices = ['down', 'up']
pd.DataFrame(np.select(conds, choices, default='zero'),
index=df1.index,
columns=df1.columns)
Pour plusieurs conditions, par exemple. (df ['employrate'] 50)
utilisez ceci:
df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]
ou vous pouvez également le faire de cette façon,
country employrate alcconsumption 0 Afghanistan 55.700001 .03 1 Albania 51.400002 7.29 2 Algeria 50.500000 .69 3 Andorra nan 10.17 4 Angola 7.000000 5.57
ici, la syntaxe informelle peut être:
df.loc[df['employrate'] > 70, 'employrate'] = 7
country employrate alcconsumption 0 Afghanistan 55.7000007629394 .03 1 Albania 51.4000015258789 7.29 2 Algeria 50.5 .69 3 Andorra 10.17 4 Angola 75.6999969482422 5.57
donc la syntaxe que nous avons utilisée ici est:
df['<column_name>'] = np.where((<filter 1> ) & (<filter 2>) , <new value>, df['column_name'])
pour une seule condition, ie. ('employrate']> 70)
out[108]:
country employrate alcconsumption
0 Afghanistan 55.700001 .03
1 Albania 11.000000 7.29
2 Algeria 11.000000 .69
3 Andorra nan 10.17
4 Angola 75.699997 5.57
utilisez ceci:
<dataset>.loc[<filter1> & (<filter2>),'<variable>']='<value>'
gm.loc[(gm['employrate'] <55) & (gm['employrate'] > 50),'employrate']=11
donc la syntaxe ici est:
df['employrate'] = np.where( (df['employrate'] <=55) & (df['employrate'] > 50) , 11, df['employrate'] )
Condition IF avec OR
First_name name_match 0 Jon Mismatch 1 Bill Match 2 Maria Mismatch 3 Emma Match
Output
from pandas import DataFrame
names = {'First_name': ['Jon','Bill','Maria','Emma']}
df = DataFrame(names,columns=['First_name'])
df.loc[(df['First_name'] == 'Bill') | (df['First_name'] == 'Emma'), 'name_match'] = 'Match'
df.loc[(df['First_name'] != 'Bill') & (df['First_name'] != 'Emma'), 'name_match'] = 'Mismatch'
print (df)
Copie possible de Pandas: filtrage de plusieurs conditions