2016-04-04 6 views
2

Ich habe einen Pandas-Datenrahmen, wo es einige fehlende Werte gibt. Ich habe bemerkt, dass die nicht fehlenden Werte nahe beieinander liegen. Daher möchte ich die fehlenden Werte durch zufällige Auswahl der nicht fehlenden Werte imputieren.Fehlende Daten durch zufällige Auswahl von nicht fehlenden Werten in Pandas Dataform füllen

Zum Beispiel:

import pandas as pd 
import random 
import numpy as np 

foo = pd.DataFrame({'A': [2, 3, np.nan, 5, np.nan], 'B':[np.nan, 4, 2, np.nan, 5]}) 
foo 
    A B 
0 2 NaN 
1 3 4 
2 NaN 2 
3 5 NaN 
4 NaN 5 

ich zum Beispiel möchte foo['A'][2]=2 und foo['A'][5]=3 Die Form meines Pandas ist Dataframe (6940,154). Ich versuche, diese

foo['A'] = foo['A'].fillna(random.choice(foo['A'].values.tolist())) 

Aber es funktioniert nicht. Könntest du mir helfen, das zu erreichen? Freundliche Grüße.

Antwort

1

Sie können die pandas.fillna-Methode und die random.choice-Methode verwenden, um die fehlenden Werte mit einer zufälligen Auswahl einer bestimmten Spalte zu füllen.

Hier Spalte ist die Spalte, die Sie mit nicht-Nan Werte zufällig füllen sollen.

+0

Ich versuche es. Aber anstatt die Werte anzugeben, wird ' bei 0x7fa4eb48b9b0> '.. –

+0

Entschuldigung, können Sie einige Beispieldaten zur Verfügung stellen? – bamdan

+0

Ich habe meine Frage mit Beispieldaten bearbeitet. Danke –

1

Dies ist ein weiterer Ansatz für diese Frage nach der Verbesserung auf der ersten Antwort zu machen und je nachdem, wie wenn ein numpy int zu überprüfen nand here in numpy Dokumentation ist

foo['A'].apply(lambda x: np.random.choice([x for x in range(min(foo['A']),max(foo['A'])]) if (np.isnan(x)) else x) 
-1

Dies funktioniert gut für mich auf Pandas Dataframe

def randomiseMissingData(df2): 
    "randomise missing data for DataFrame (within a column)" 
    df = df2.copy() 
    for col in df.columns: 
     data = df[col] 
     mask = data.isnull() 
     samples = random.choices(data[~mask].values , k = mask.sum()) 
     data[mask] = samples 

return df 
0

Hier ist eine weitere Pandas Dataframe Ansatz

import numpy as np 
def fill_with_random(df2, column): 
    '''Fill `df2`'s column with name `column` with random data based on non-NaN data from `column`''' 
    df = df2.copy() 
    df[column] = df[column].apply(lambda x: np.random.choice(df[column].dropna().values) if np.isnan(x) else x) 
    return df 
Verwandte Themen