2017-10-12 9 views
0

Je dataframe comme ci-dessous:Remplacement d'une valeur de ligne avec la valeur la plus fréquente chez les Pandas dataframe

|   types | freq |  TypeList 
0 | Q11424 (item) | 29 | Q11424 (item),Q571 (item) 
1 |  Q571 (item) | 9 | Q11424 (item),Q571 (item) 
0 | Q11012 (item) | 6 | Q11012 (item) 
0 | Q4830453 (item) | 39 | Q4830453 (item) 
0 | Q7725634 (item) | 2 | Q7725634 (item),Q571 (item) 
1 |  Q571 (item) | 9 | Q7725634 (item),Q571 (item) 
0 | Q785479 (item) | 1 | Q785479 (item),Q1344 (item) 
1 |  Q1344 (item) | 1 | Q785479 (item),Q1344 (item) 

colonne « types » est en fait une colonne aplatie de « TypeList ». Et la colonne freq indique la fréquence de chaque valeur dans les types de colonne. Ces fréquences proviennent de l'ensemble des données. Ici, je viens d'ajouter quelques-unes de ces lignes. Par exemple. Q571 s'est produit 9 fois dans la colonne des types et a donc freq = 9. La colonne TypeList est une liste de types pour chaque enregistrement. Je veux ajouter une nouvelle colonne SuperType qui aura le type le plus fréquent si la colonne TypeList contiendra plus d'un type. Par exemple. Je veux le résultat suivant:

|   types | freq |  TypeList     |SuperType 
0 | Q11424 (item) | 29 | Q11424 (item),Q571 (item) | Q11424 
1 |  Q571 (item) | 9 | Q11424 (item),Q571 (item) | Q11424 
0 | Q11012 (item) | 6 | Q11012 (item)    | Q11012 
0 | Q4830453 (item) | 39 | Q4830453 (item)    | Q4830453 
0 | Q7725634 (item) | 2 | Q7725634 (item),Q571 (item) | Q571 
1 |  Q571 (item) | 9 | Q7725634 (item),Q571 (item) | Q571 
0 | Q785479 (item) | 1 | Q785479 (item),Q1344 (item) | Q785479 
1 |  Q1344 (item) | 1 | Q785479 (item),Q1344 (item) | Q785479 

Dans la première rangée, colonne TypeList a une valeur "Q11424 (point), Q571 (point)". Donc, je veux vérifier les fréquences de ces deux types, c'est-à-dire 29 et 9 resp. et affectez le type le plus fréquent dans la colonne superType pour cette ligne, c'est-à-dire Q11424 dans ce cas.

Répondre

1

En utilisant transform

df['SuperType']=df.sort_values('freq').groupby('TypeList')['types'].transform('last') 
df['SuperType']=df.SuperType.str[:-6] 
df.sort_index() 
Out[1124]: 
      types freq      TypeList SuperType 
0 Q11424 (item) 29 Q11424 (item),Q571 (item) Q11424 
1  Q571 (item)  9 Q11424 (item),Q571 (item) Q11424 
2 Q11012 (item)  6    Q11012 (item) Q11012 
3 Q4830453 (item) 39    Q4830453 (item) Q4830453 
4 Q7725634 (item)  2 Q7725634 (item),Q571 (item)  Q571 
5  Q571 (item)  9 Q7725634 (item),Q571 (item)  Q571 
6 Q785479 (item)  1 Q785479 (item),Q1344 (item)  Q1344 
7  Q1344 (item)  1 Q785479 (item),Q1344 (item)  Q1344 

Edit:

df=df.sort_values('freq') 
df['SuperType']=df.groupby('TypeList')['types'].transform('last').values 
df['SuperType']=df.SuperType.str[:-6] 
+0

@ScottBoston édité .. – Wen

+0

Je reçois "ValueError: ne peut pas réindexer d'un axe en double" exception après l'exécution de la première ligne. L'exception se produit uniquement si j'essaie d'affecter la valeur à df ['superType'], sinon cela fonctionne. –

+0

@NilakshiNaphade essayer mon édition – Wen