J'ai un dataframe pandas comme tel :
id =[30,30,40,40,30,40,55,30]
month =[1,3,11,4,10,2,12,12]
average=[90,80,50,92,18,15,16,55]
sec =['id1','id1','id3','id4','id2','id2','id1','id1']
df = pd.DataFrame(list(zip(id,sec,month,average)),columns =['id','sec','month','Average'])
Nous voulons ajouter une colonne supplémentaire contenant des mois séparés par des virgules dans les conditions suivantes
- Nécessité d'exclure id2 sec
- et en dessous de la moyenne de 90
Résultats souhaités
J'ai essayé le code ci-dessous mais je n'obtiens pas le résultat souhaité.
final=pd.DataFrame()
for i in set(sec):
if i !='id2': #Exclude id2
d2 =df[df['sec']==i]
d2=df[df['average']<90] # apply below 90 condition
d2=d2[['id','month']].groupby(['id'], as_index=False).agg(lambda x: ', '.join(sorted(set(x.astype(str))))) #comma seperated data
d2.rename(columns={'month':'problematic_month'},inplace=True)
d2['sec']=i
tab =df.merge(d2,on =['id','sec'], how ='inner')
final =final.append(tab)
else:
d2 =df[df['sec']==i]
d2['problematic_month']=np.NaN
final =final.append(d2)
Merci de nous suggérer une autre méthode (sans fusion) pour obtenir le résultat souhaité.