Supposons que j'ai le jeu de données iris. Existe-t-il un moyen d'effectuer de manière concise les opérations ci-dessous dans pandas ?
- Grouper par cible
- A l'intérieur de chaque groupe, arranger les données par "longueur du sépale (cm)" en ordre décroissant
- A l'intérieur de chaque groupe, attribuer 1 aux 5 premières lignes et 0 au reste ?
Pour ceux qui connaissent R, je veux simplement reproduire le code suivant (oui, c'était une solution de contournement là-bas) :
iris %>%
group_by(Species) %>%
arrange(desc(Sepal.Length)) %>%
mutate(size_tag = 1,
size_tag = cumsum(size_tag),
size_tag = ifelse(size_tag <= 5, 1, 0))
Jusqu'à présent j'ai :
from sklearn import datasets
iris = datasets.load_iris()
iris = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= iris['feature_names'] + ['target'])
def fn(group, col_nm):
group[col_nm] = 1
group[col_nm] = np.cumsum(group[col_nm])
group[col_nm] = np.where(group[col_nm] <= 5, 1, 0)
return group
iris['size_tag'] = np.NaN
iris.groupby('target').apply( pd.DataFrame.sort_values, 'sepal length (cm)' ).apply( fn, args = (['size_tag']))
Le résultat que j'obtiens est une ligne supplémentaire ajoutée au DataFrame...
Je débute tout juste avec pandas et Python, donc tout commentaire (par exemple, lié au style de codage) est le bienvenu.