2017-10-18 3 views
0

Je suis novice à Python - j'essaie de remplacer NULL et vide ('') valeurs se produisant dans une colonne d'un Trame de données Pandas avec l'élément le plus fréquent dans cette colonne. Mais je dois être capable de le faire pour toutes les colonnes et toutes les lignes du cadre de données. J'ai écrit le code suivant - Mais cela prend beaucoup de temps à exécuter. Pouvez-vous s'il vous plaît m'aider à optimiser?Remplacer les valeurs vides et vides dans toutes les colonnes de trame de données avec l'élément Non Null le plus fréquent des colonnes respectives

Merci Saptarshi

for column in df: 
    #Get the value and frequency from the column 
    tempDict = df[column].value_counts().to_dict() 

    #pop the entries for 'NULL' and '?' 
    tempDict.pop(b'NULL',None) 
    tempDict.pop(b'?',None) 

    #identify the max item of the remaining set 
    maxItem = max(tempDict) 

    #The next step is to replace all rows where '?' or 'null' appears with maxItem 
    #df_test[column] = df_test[column].str.replace(b'NULL', maxItem) 
    #df_test[column] = df_test[column].str.replace(b'?', maxItem) 
    df[column][df[column] == b'NULL'] = maxItem 
    df[column][df[column] == b'?'] = maxItem 
+0

Quel comportement souhaitez-vous lorsqu'il n'y a pas d'élément "le plus fréquent" (c'est-à-dire lorsque toutes les valeurs sont nulles ou lorsque plusieurs éléments sont liés)? – ASGM

Répondre

0

Vous pouvez utiliser mode() pour trouver la valeur la plus commune dans chaque colonne:

for val in ['', 'NULL', '?']: 
    df.replace(val, df.mode().iloc[0]) 

Parce qu'il peut y avoir plusieurs valeurs modales, mode() renvoie une trame de données. L'utilisation de .iloc[0] prend la première valeur à partir de cette image. Vous pouvez utiliser fillna() au lieu de replace() comme @Wen si vous voulez également convertir les valeurs NaN.

0

Je crée un exemple de données ici.

df = pd.DataFrame({'col1': [6,3,'null',4,4,2,'?'], 'col2': [6,3,2,'null','?',2,2]}) 
df.replace({'?':np.nan},inplace=True) 
df.replace({'null':np.nan},inplace=True) 
df.fillna(df.apply(lambda x : x.mode()[0])) 

Out[98]: 
    col1 col2 
0 6.0 6.0 
1 3.0 3.0 
2 4.0 2.0 
3 4.0 2.0 
4 4.0 2.0 
5 2.0 2.0 
6 4.0 2.0 
+0

Appréciez l'explication détaillée - Merci, c'est vraiment une grande communauté –