2017-06-27 2 views
1

Verlangen halten:Pandas: zwei Datenrahmen zusammenfassen und sich nicht schneidende Daten von einem einzelnen Datenrahmen

Ich möchte eine Art und Weise zwei Datenrahmen zu fusionieren und die nicht durchschnitten von Daten aus einem spezifizierten Datenrahmen zu halten.

Problem:

Ich habe doppelte Daten und ich erwartete, diese Zeile, die doppelten Daten zu entfernen:

final_df = new_df[~new_df.isin(previous_df)].dropna() 

Beispieldaten und Daten-Test:

record = Record(1000, 9300815, '<redacted type>', '<redacted id>') 
test_df = pd.DataFrame([record]) 
if not final_df.empty: 

     # this produces an empty data frame 
     empty_df = test_df[test_df.isin(final_df)].dropna() 

     # this produces the record 
     record_df = final_pdf[final_pdf.col01 == record.col01] 

Hintergrund:

Ich lade XML-Daten und konvertiere die XML-Datei in mehrere verschiedene reco rd types als namedtuples. Ich spalte jeden Datensatztyp in seinen eigenen Datenrahmen. Ich vergleiche dann den aktuellen Satz von Daten aus der XML-Datei mit den Daten, die bereits in die Datenbank geladen von previous_df als solche Konstruktion:

previous_df = pd.read_sql_table(table_name, con=conn, schema=schema, columns=columns) 

Spalten werden dynamisch auf den Feldern in der genannten Tupel erstellt basiert. Das Datenbankschema wird mit Hilfe von sqlalchemy generiert, und ich habe UniqueConstraint hinzugefügt, um zu verwalten, wenn ich glaube, dass es Dubletten in der Datenbank gibt.

Vielen Dank im Voraus für jede Hilfe zur Verfügung gestellt.

+0

Blick auf [pandas.DataFrame.duplicated] (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.duplicated.html#pandas-dataframe-duplicated). Wenn Sie einige Beispieldaten und die erwartete Ausgabe hinzufügen, erhalten Sie detaillierte Hilfe. –

+0

Ich habe auch 'drop_duplicates (keep = False)' 'verwendet, was effektiv' duplicated' aufruft und sie dann in einer einzigen Zeile entfernt. Ich brauche wirklich eine gute Möglichkeit, zwei Datenrahmen zusammenzuführen und deren Schnittpunkt zu entfernen. –

+0

Ich würde empfehlen, [Pandas Dokumentation] (https://pandas.pydata.org/pandas-docs/stable/merging.html) zum Zusammenführen von Datenrahmen zu sehen. Ich sehe nicht genau, wohin Sie gehen möchten, aber Sie können dort eine Lösung für Ihr Problem finden –

Antwort

1

PRESERVING Einzelsatz- aus beiden Datenrahmen:

Versuchen Sie concat den ersten Datenrahmen, so dass Sie sicher sind, dass Sie Duplikate haben. Dann wenden Sie drop_duplicates an und ich denke, dass Sie mit dem enden werden, wonach Sie suchen. Siehe nachstehendes Beispiel:

#Create dummy data 
df1 = pd.DataFrame(columns=["A","B"],data=[[1,2],[3,4],[5,6]]) 
print(df1) 

    A B 
0 1 2 
1 3 4 
2 5 6 

df2 = pd.DataFrame(columns=["A","B"],data=[[3,4],[5,6],[7,8],[9,10]]) 
print(df2) 

    A B 
0 3 4 
1 5 6 
2 7 8 
3 9 10 

#Concatenate dataframes 
df = pd.concat([df1,df2],axis=0) 
print(df) 

    A B 
0 1 2 
1 3 4 
2 5 6 
0 3 4 
1 5 6 
2 7 8 
3 9 10 

#Drop duplicates 
df = df.drop_duplicates(keep=False) 
print(df) 

    A B 
0 1 2 
2 7 8 
3 9 10 

PRESERVING SINGLE RECORDS VON EINEM Datenrahmen NUR:

Wenn Sie nur die Daten aus der neuen Datenrahmen halten möchten, verwenden Sie einfach einen schmutzigen Trick: concat der alte Datenrahmen zweimal, so dass alle alten Datensätze unter drop_duplicates fallen. Wie so:

#Concatenate dataframes with old dataframe taken twice! 
df = pd.concat([df1,df1,df2],axis=0) 

#Now you will only end up with the records from second dataframe 
df = df.drop_duplicates(keep=False) 
print(df) 

    A B 
2 7 8 
3 9 10 
+0

Danke - ich werde das versuchen –

+0

Wenn Sie nur die Daten aus dem neuen Datenrahmen behalten wollen, verwenden Sie einfach einen schmutzigen kleinen Trick : Concate den alten Datenrahmen zweimal, so dass alle alten Datensätze fallen drop_duplicates Kriterien. –

+0

Siehe mein bearbeitetes Beispiel. –

Verwandte Themen