2017-06-27 79 views
1

願望:熊貓:合併兩個數據幀,並從單個數據幀保持非交叉數據

我想辦法合併兩個數據幀和從指定的數據幀保持不相交的數據。

問題:

我有重複的數據和I預期這條線,以去除重複數據:

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

實施例的數據和數據測試:

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] 

背景:

我正在加載xml數據並將xml文件轉換爲幾種不同的記錄rd類型爲namedtuples。我將每種記錄類型分成它自己的數據框。然後,我從XML文件已經通過構建previous_df這樣加載到數據庫中的數據比較當前的一組數據:

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

列是動態創建的基於命名元組的字段。數據庫模式是使用sqlalchemy生成的,並且當我認爲數據庫中存在重複時,我添加了UniqueConstraint進行管理。

在此先感謝您提供的任何幫助。

+0

看[pandas.DataFrame.duplicated](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.duplicated.html#pandas-dataframe-duplicated )。如果你添加一些樣本數據和預期的輸出,你會得到一些詳細的幫助。 –

+0

我也使用過'drop_duplicates(keep = False)',它有效地調用'duplicateated',然後在一行中刪除它們。我真的需要一種合併兩個數據框並移除它們的交集的好方法。 –

+0

我會推薦查看關於合併數據框的[Pandas Documentation](https://pandas.pydata.org/pandas-docs/stable/merging.html)。我沒有看到你想要去的具體位置,但是你可以在那裏找到解決問題的方法 –

回答

1

保單記錄從BOTH DATAFRAMES:

嘗試concat的dataframes第一,讓你相信,你將有重複。然後申請drop_duplicates,我想你最終會得到你在做什麼。看下面的例子:

#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 

保單RECORDS從一個數據幀ONLY:

如果你只想在新數據框中保存數據,只需要使用一個骯髒的小竅門:concat舊的數據幀兩次,因此所有舊記錄都將落入drop_duplicates標準。像這樣:

#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

謝謝 - 我會嘗試 –

+0

如果你只想保留新數據幀的數據,只需使用一個骯髒的小動作:對舊數據幀進行兩次Concat,以便所有舊記錄將落入drop_duplicates標準。 –

+0

看我編輯的例子。 –