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!
Dataframes kombinieren
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
-
- 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
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
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:
Vorher:
Nachher:
Jedoch weiß Ich nicht wie sich das bei langen Datensätzen verhält ... kannst du ja mal ausprobieren und dich wieder melden
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
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