J'ai un Dataframe dont une colonne qui contient un ID. Cet identifiant représente une personne et peut être présent plusieurs fois:

        col_id    col2     col3     col4....
row1      1
row2      1
row3      2
row4      3
row5      3
row6      3
row7      1
row8      7

Je dois renvoyer une nouvelle trame de données où le value_counts de la colonne ID est supérieur à, disons 2.

Nouvelle trame de données:

         col_id    col2     col3     col4....
row1      1
row2      1
row3      3
row4      3
row5      3
row6      1

Cette nouvelle trame de données contient des lignes où le nombre d'ID est supérieur à 2 uniquement.

Modifier

À partir de là, je dois séparer les données par ID. Idéalement, je voudrais une solution où j'ai une trame de données pour chaque ID:

Dataframe 1

    col_id   col2    col3    col4....
r1     1
r2     1
r3     1

Dataframe 2

    col_id   col2    col3    col4....
r1     2
r2     2
r3     2

Dataframe 3

    col_id   col2    col3    col4....
r1     3
r2     3
r3     3

Est-il possible de les regrouper en une seule grande trame de données? Je peux donc avoir une nouvelle colonne, appelée 'index' qui contient les lignes pour ID == 1, ID == 2, etc.:

index
  1        col_id   col2    col3    col4....
       r1     1
       r2     1
       r3     1



index
  2       col_id   col2    col3    col4....
      r1     2
      r2     2
      r3     2


    index
       3      col_id   col2    col3    col4....
         r1     3
         r2     3
         r3     3
5
Mazz 11 mars 2019 à 14:08

2 réponses

Meilleure réponse

Utilisez GroupBy.transform< /a> avec GroupBy.size pour Series avec la même taille que le DataFrame d'origine, donc filtre possible par boolean indexing :

df = df[df.groupby('col_id')['col_id'].transform('size') > 2]
print (df)
      col_id
row1       1
row2       1
row4       3
row5       3
row6       3
row7       1

Si les performances ne sont pas importantes ou petites, DataFrame est possible, utilisez DataFrameGroupBy.filter :

df = df.groupby('col_id').filter(lambda x: len(x) > 2)

EDIT : pour des DataFrames séparés par col_id, il est possible de créer un dictionnaire de DataFrames :

dfs = dict(tuple(df.groupby('col_id')))
print (dfs[1])
      col_id
row1       1
row2       1
row7       1

print (dfs[2])
      col_id
row3       2

print (dfs[3])
      col_id
row4       3
row5       3
row6       3

Solution possible, mais non pythonique avec des globals, utilisation déconseillée (uniquement pour le fun) :

for i, df in df.groupby('col_id'):
    globals()['df{}'.format(i)] =  df

print (df1)
      col_id
row1       1
row2       1
row7       1
8
jezrael 11 mars 2019 à 11:40

Si vous voulez continuer avec votre méthode value_counts(), suivez -

# Creating a dictionary using value_counts()
items = df.col_id.value_counts().to_dict().items()

# Filtering only those rows where duplicate entries occur more than n
n = 2
df = df[df.col_id.isin([key for key, val in items if val > n])]
2
meW 11 mars 2019 à 11:23