J'ai un DataFrame avec trois colonnes: unité, influenceur et valeur. Il existe différents types d'influenceurs et les valeurs représentent le nombre de l'unité. Je souhaite créer un nouveau tableau affichant les n unités les plus et les moins fréquentes pour chaque influenceur et leurs valeurs respectives.
Mon df ressemble à ceci:
VAL1 VAL2 VAL3 321 NaN NaN NaN 200 NaN NaN NaN 20 12 NaN NaN NaN 3 NaN ...
3 Réponses :
essayez de créer une fonction du type:
>>> def selc_df(df, x=2): ... return df.head(x).append(df.tail(x)) ... >>> selc_df(df,2) A B 0 1 345 1 2 366 6 5 957 7 6 543
Exemple:
>>> df A B 0 1 345 1 2 366 2 3 299 3 3 455 4 4 879 5 5 321 6 5 957 7 6 543
Résultat:
def selc_df(df, x=2):
return df.head(x).append(df.tail(x))
selc_df(df,2)
Le principal problème avec cela est que j'ai besoin de la tête et de la queue de chaque influenceur, plutôt que de la tête et de la queue de l'ensemble du dataframe.
Vous pouvez essayer:
Unit Influencer Value 0 A foo 321 1 B foo 200 3 D foo 12 4 E foo 3 5 A bar 999 6 B bar 209 9 E bar 15 10 F bar 2
Sortie
nlargest = df.groupby('Influencer')['Value'].nlargest(2).reset_index()['level_1'].values
nsmallest = df.groupby('Influencer')['Value'].nsmallest(2).reset_index()['level_1'].values
result = pd.concat([df.iloc[nlargest], df.iloc[nsmallest]]).sort_index()
print(result)
Merci beaucoup! Cela fonctionne parfaitement. Je suis cependant curieux, pourquoi avons-nous besoin de .reset_index () dans ce cas?
J'ai fait ça pour accéder aux indices du niveau 1
Utilisation de
#df=df.sort_values('Value')
g=df.groupby('Influencer')
pd.concat([g.head(2),g.tail(2)]).sort_index()
Out[693]:
Unit Influencer Value
0 A foo 321
1 B foo 200
3 D foo 12
4 E foo 3
5 A bar 999
6 B bar 209
9 E bar 15
10 F bar 2
Le «A» manque dans la sortie, une raison spécifique?
Désolé, j'ai dû déplacer certaines de mes valeurs et j'ai oublié de modifier la sortie pour refléter cela. J'ai modifié la question pour résoudre ce problème. Merci!