Ich habe zwei Datenrahmen - einen großen Datenrahmen mit mehreren kategorialen Spalten und eine Spalte mit fehlenden Werten und einen anderen, der eine Art Wörterbuch mit denselben kategorialen Spalten und eine Spalte mit einem Schlüsselwert darstellt.

Im Wesentlichen möchte ich die fehlenden Werte im großen Datenrahmen mit dem Schlüsselwert im zweiten füllen, wenn alle kategorialen Spalten übereinstimmen.

Fehlender Wert df:

    Color      Number    Letter       Value
0   Red          2          B          NaN
1   Green        2          A          NaN 
2   Red          2          B          NaN
3   Red          1          B          NaN
4   Green        1          A          NaN
5   Red          2          B          NaN
6   Green        1          B          NaN
7   Green        2          A          NaN

Wörterbuch df:

    Color      Number    Letter       Value
0   Red          1          A          10
1   Red          1          B           4
2   Red          2          A           3
3   Red          2          B          15
4   Green        1          A          21
5   Green        1          B           9
6   Green        2          A          22
7   Green        2          B           1

Gewünschtes df:

0   Red          2          B          15
1   Green        2          A          22 
2   Red          2          B          15
3   Red          1          B          4
4   Green        1          A          21
5   Red          2          B          15
6   Green        1          B          9
7   Green        2          A          22

Ich bin mir nicht sicher, ob ich das 'Dictionary df' als tatsächliches Wörterbuch haben oder es als Datenrahmen behalten soll (es wird aus einer CSV gezogen).

Ist dies möglich, ohne eine Vielzahl von if else-Aussagen sauber zu machen?

Vielen Dank!

0
YummyBlueberries 23 Feb. 2020 im 23:56

3 Antworten

Beste Antwort

Funktioniert das?

>>> df_1[['Color', 'Number', 'Letter']].merge(df_2, 
...                                           on=('Color', 'Number', 'Letter'),   
...                                           how='left')
   Color  Number Letter  Value
0    Red       2      B     15
1  Green       2      A     22
2    Red       2      B     15
3    Red       1      B      4
4  Green       1      A     21
5    Red       2      B     15
6  Green       1      B      9
7  Green       2      A     22

Ich fand es erwähnenswert - eine sehr einfache Möglichkeit, Beispiele aus Stackoverflow-Pandas-Fragen in einen Datenrahmen zu konvertieren. Schneiden Sie sie einfach aus und fügen Sie sie in eine Zeichenfolge wie die folgende ein:

>>> df_1 = pd.read_csv(StringIO("""
...     Color      Number    Letter       Value
... 0   Red          2          B          NaN
... 1   Green        2          A          NaN
... 2   Red          2          B          NaN
... 3   Red          1          B          NaN
... 4   Green        1          A          NaN
... 5   Red          2          B          NaN
... 6   Green        1          B          NaN
... 7   Green        2          A          NaN
... """), sep=r'\s+')
1
Todd 24 Feb. 2020 im 04:50

Ich werde den fehlenden Wert df als: df und das Wörterbuch df als: ddf aufrufen, wobei beide als Datenrahmen betrachtet werden

Löschen Sie zuerst die Spalte mit den Nullwerten aus dem fehlenden Wert df:

df.drop(['Value'], axis=1)

Führen Sie zweitens den folgenden Befehl aus, der die Aufgabe für Sie erledigen soll.

df.assign(Value=ddf['Value'])
0
Jai 23 Feb. 2020 im 21:34

Versuchen:

missing_df.reset_index()[['index', 'Color', 'Number', 'Letter']]\
          .merge(dict_df, on = ['Color', 'Number', 'Letter'])\
          .set_index('index').reindex(missing_df.index)

Ausgabe:

  Color  Number Letter  Value
0    Red       2      B     15
1  Green       2      A     22
2    Red       2      B     15
3    Red       1      B      4
4  Green       1      A     21
5    Red       2      B     15
6  Green       1      B      9
7  Green       2      A     22
1
Scott Boston 24 Feb. 2020 im 01:17