Pandas:合并两个数据框,保留单个数据框的非交叉数据
Pandas: Merge two data frames and keep non-intersecting data from a single data frame
愿望:
我想要一种方法来合并两个数据帧并保留指定数据帧中的非交叉数据。
问题:
我有重复数据,我希望这一行能够删除重复数据:
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 文件转换为几种不同的记录类型作为命名元组。我将每种记录类型拆分为自己的数据框。然后,我将 xml 文件中的当前数据集与已经通过构建 previous_df
加载到数据库中的数据进行比较:
previous_df = pd.read_sql_table(table_name, con=conn, schema=schema, columns=columns)
列是根据命名元组中的字段动态创建的。数据库模式是使用 sqlalchemy 生成的,当我认为数据库中有重复时,我添加了 UniqueConstraint
来管理。
在此先感谢您提供的任何帮助。
从两个数据框中保留单个记录:
首先尝试 concat
数据帧,这样你就可以确定你会有重复项。然后应用 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
仅从一个数据帧中保留单个记录:
如果您只想保留新数据帧中的数据,只需使用一个肮脏的小技巧: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
愿望:
我想要一种方法来合并两个数据帧并保留指定数据帧中的非交叉数据。
问题:
我有重复数据,我希望这一行能够删除重复数据:
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 文件转换为几种不同的记录类型作为命名元组。我将每种记录类型拆分为自己的数据框。然后,我将 xml 文件中的当前数据集与已经通过构建 previous_df
加载到数据库中的数据进行比较:
previous_df = pd.read_sql_table(table_name, con=conn, schema=schema, columns=columns)
列是根据命名元组中的字段动态创建的。数据库模式是使用 sqlalchemy 生成的,当我认为数据库中有重复时,我添加了 UniqueConstraint
来管理。
在此先感谢您提供的任何帮助。
从两个数据框中保留单个记录:
首先尝试 concat
数据帧,这样你就可以确定你会有重复项。然后应用 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
仅从一个数据帧中保留单个记录:
如果您只想保留新数据帧中的数据,只需使用一个肮脏的小技巧: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