1
votes

Nouvelle trame de données Pandas affichant les N valeurs supérieures et inférieures par groupe

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
...


2 commentaires

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!


3 Réponses :


0
votes

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)


1 commentaires

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.



3
votes

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)


2 commentaires

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



3
votes

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


0 commentaires