Dataframes kombinieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
OrangeZebra
User
Beiträge: 3
Registriert: Dienstag 24. November 2020, 15:31

Hallo
Ich möchte df1 mit Werten aus df2 anreichern, wenn keine eingegeben wurden. Beispiel:
df1 = pd.DataFrame(
... {
... "key": ["a", "c", "e", "a", "c", "e"],
... "value": [1, 2, 3, np.nan, 2, 3],
... "value2": [11, 12, 13, 14, 15, 16]
... })

df2 enthält die Stammdaten:
df2 = pd.DataFrame(
... {
... "key": ["a", "b","c", "d", "e", "f"],
... "ref_value": [100, 200, 300, 400, 500, 600]
... })

Am Ende soll df1 wie folgt aussehen:
... "key": ["a", "c", "e", "a", "c", "e"],
... "value": [1, 2, 3, 100, 2, 3],
... "value2": [11, 12, 13, 14, 15, 16]

Wie mach' ich das? mit Merge, join und co komm' ich noch nicht so klar...
Vielen Dank!
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Code: Alles auswählen

import pandas as pd
import numpy as np

dict1 = {
    "key": ["a", "c", "e", "a", "c", "e"],
    "value": [1, 2, 3, np.nan, 2, 3],
    "value2": [11, 12, 13, 14, 15, 16]
}

# df2 enthält die Stammdaten:
dict2 ={
        "key": ["a", "b", "c", "d", "e", "f"],
        "ref_value": [100, 200, 300, 400, 500, 600]
    }

df1 = pd.DataFrame.from_dict(dict1)
df2 = pd.DataFrame.from_dict(dict2)


df1 = pd.concat([df2,df1],axis=1,ignore_index=True)

print(df1)


Ausgabe :
So hättest du keine doppelten Werte

Code: Alles auswählen

   0    1  2    3   4
0  a  100  a  1.0  11
1  b  200  c  2.0  12
2  c  300  e  3.0  13
3  d  400  a  NaN  14
4  e  500  c  2.0  15
5  f  600  e  3.0  16


Hier hast du zwar alle werte jedoch auch doppelte ....
df1 = df1.merge(df2, how='right')
Eine Vision ohne Aktion bleibe eine Illusion
OrangeZebra
User
Beiträge: 3
Registriert: Dienstag 24. November 2020, 15:31

Vielen Dank
So ganz geschieht noch nicht, was ich gern hätte. Aber vielleicht habe ich die Aufgabe etwas unklar formuliert, drum versuche ich's nochmals:
Ich habe ein df, aus xls importiert, mehrere 1000 Zeilen:
DataFrame1:
key value1 value 2..n
a 1 11
c 2 12
e 3 13
a nan 14
c 2 15
e 3 16

Mit Hilfe von DataFrame2 (auch ein XLS-Import) möchte ich df1 komplettieren
DataFrame2 sieht wie folgt aus:
key ref_value
a 100
b 200
c 300
d 400
e 500

In df 1 sollen nan in value1 mit dem in df2 bei key ref_value komplettiert werden.
Entsprechend soll mein Ziel-Dataframe vor der weiteren Auswertung wie folgt aussehen:

key value1 value 2..n
a 1 11
c 2 12
e 3 13
a 100 14
c 2 15
e 3 16

Ich habe schon verschiedenes versucht (merge, join, ordered_merge), zum Teil hat es halb funktioniert (was ich wirklich tat, weiss ich nicht so recht...), es gab dann Spalten value1_x und value1_y. Details habe ich auf meinem Firmen-Rechner, kann ich morgen nachliefern.

Vielen Dank für eure Hilfe
Gruss
Stephan
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

gelöscht
Eine Vision ohne Aktion bleibe eine Illusion
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Sorry in dem anderen Code war ein Bug....

Ich gehe davon aus das nur die NAN Werte ersetzt werden sollen mit einem anderen Dataframe der gleich groß ist ( weil zum Beispiel der Index Datum etc dastellt ... )

Nochmal der Versuch:

Code: Alles auswählen

import pandas as pd
import numpy as np

df = pd.DataFrame({1: [10, np.nan, 12, 13, np.nan], 2: [100, 110, 120, 130, 140]})
df1 = pd.DataFrame({1: [1, 2, 3, 4, 5]})

test = [1, 2]
for index in df.index:
    if pd.isna(df[1].iloc[index]):
        # df.loc[index,1] = test[cnt]
        df.loc[index, 1] = df1.loc[index, 1]
print(df)

Vorher:

Code: Alles auswählen

      1    2
0  10.0  100
1   NaN  110
2  12.0  120
3  13.0  130
4   NaN  140
Nachher:

Code: Alles auswählen

      1    2
0  10.0  100
1   2.0  110
2  12.0  120
3  13.0  130
4   5.0  140

Jedoch weiß Ich nicht wie sich das bei langen Datensätzen verhält ... kannst du ja mal ausprobieren und dich wieder melden
Eine Vision ohne Aktion bleibe eine Illusion
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Guck sonst auch mal nach Pandas Update ( das ist eine Funktion die glaube ich sogar genau das macht was du möchtest )
Eine Vision ohne Aktion bleibe eine Illusion
Antworten