比较两个具有差异长度的数据帧以查找特定列中的差异
Comparing two Dataframes with diff length to find difference in specific column
我有 2 个数据帧具有相同的列但长度不同。
in [1] : df_g = pd.DataFrame([['EDC_TRAING_NO', 'EDU_T_N', 'NUMVER', '20'],
['EDC_TRAING_NAME', 'EDU_T_NM', 'VARCHAR', '40'],
['EDC_TRAING_ST', 'EDU_T_SD', 'DATETIME', '15'],
['EDC_TRAING_END', 'EDU_T_ED', 'DATETIME', '15'],
['EDC_PLACE_NM', 'EDU_P_NM', 'VARCHAR2', '40'],
['ONLINE_REQST_POSBL_AT', 'ONLINE_R_P_A', 'VARCHAR2', '1']],
columns=['NAME', 'ID', 'TYPE', 'LEN'])
in [2] : df_n = pd.DataFrame([['EDC_TRAING_NO', 'EDU_TR_N', 'NUMVER', '20'],
['EDC_TRAING_NAME', 'EDU_TR_NM', 'VARCHAR', '20'],
['EDC_TRAING_ST', 'EDU_TR_SD', 'DATETIME', '15'],
['EDC_TRAING_END', 'EDU_T_ED', 'DATETIME', '15'],
['EDC_PLACE_NM', 'EDU_PL_NM', 'VARCHAR2', '40'],
['ONLINE_REQST_POSBL_AT', 'ONLINE_REQ_P_A', 'VARCHAR2', '1']],
columns=['NAME', 'ID', 'TYPE', 'LEN'])
我想得到的结果:
result = pd.DataFrame([['EDC_TRAING_NO', 'EDU_TR_N', 'NUMVER', '20'],
['EDC_TRAING_ST', 'EDU_TR_SD', 'DATETIME', '15'],
['EDC_TRAING_END', 'EDU_T_ED', 'DATETIME', '15'],
['EDC_PLACE_NM', 'EDU_PL_NM', 'VARCHAR2', '40'],
['ONLINE_REQST_POSBL_AT', 'ONLINE_REQ_P_A', 'VARCHAR2', '1']],
columns=['NAME', 'ID', 'TYPE', 'LEN'])
每个 df 都有这样的长度。
len(df_g) : 1000
len(df_n) : 5000
每个数据框都有名为'name, id, type, len'
我需要检查每个 df 中的那些列(名称、类型、len)以比较“id”列是否具有相同的值。
所以我这样试过。
for i in g.index:
for j in n.index:
g = g.iloc[i].values
# make it to ndarray
g_Str = g[0] + g[2] + g[3]
# make it to str for pivot
n = n.iloc[j].values
n_Str = n[0] + str(n[2]) + str(n[3])
# comparing and check two df
if g_Str == n_Str and g[1] != n[1]:
print(i, j)
print(g[0])
我有上面的代码用于 2 个不同长度的 DataFrame。
首先,我尝试使用 'iterrows()' 来比较这两个 df,
但是花了太多时间。(很慢)
我寻找了其他方法来使其性能更好。
我发现的可能方法
选项1
使用 to_dict() 将 df 转换为 dict / 比较嵌套 for-loop
中的那些
选项2
将 df.series 转换为 ndarray / 比较嵌套 for-loop
中的那些
还有其他更好的选择吗?
或不使用嵌套 for 循环的任何选项?
谢谢。
你可以试试merge,
如果您正在寻找 ID 不匹配的记录,那么以下是实现它的一种方法:
r1=df_g.merge(df_n,on=['NAME', 'TYPE', 'LEN'],how='inner').query('ID_x != ID_y').rename(columns={'ID_x': 'ID'}).drop('ID_y', 1)
我使用过how="inner" join,但根据需要可以使用以下任意一种join:
{‘left’, ‘right’, ‘outer’, ‘inner’, ‘cross’}, 默认‘inner’
我有 2 个数据帧具有相同的列但长度不同。
in [1] : df_g = pd.DataFrame([['EDC_TRAING_NO', 'EDU_T_N', 'NUMVER', '20'],
['EDC_TRAING_NAME', 'EDU_T_NM', 'VARCHAR', '40'],
['EDC_TRAING_ST', 'EDU_T_SD', 'DATETIME', '15'],
['EDC_TRAING_END', 'EDU_T_ED', 'DATETIME', '15'],
['EDC_PLACE_NM', 'EDU_P_NM', 'VARCHAR2', '40'],
['ONLINE_REQST_POSBL_AT', 'ONLINE_R_P_A', 'VARCHAR2', '1']],
columns=['NAME', 'ID', 'TYPE', 'LEN'])
in [2] : df_n = pd.DataFrame([['EDC_TRAING_NO', 'EDU_TR_N', 'NUMVER', '20'],
['EDC_TRAING_NAME', 'EDU_TR_NM', 'VARCHAR', '20'],
['EDC_TRAING_ST', 'EDU_TR_SD', 'DATETIME', '15'],
['EDC_TRAING_END', 'EDU_T_ED', 'DATETIME', '15'],
['EDC_PLACE_NM', 'EDU_PL_NM', 'VARCHAR2', '40'],
['ONLINE_REQST_POSBL_AT', 'ONLINE_REQ_P_A', 'VARCHAR2', '1']],
columns=['NAME', 'ID', 'TYPE', 'LEN'])
我想得到的结果:
result = pd.DataFrame([['EDC_TRAING_NO', 'EDU_TR_N', 'NUMVER', '20'],
['EDC_TRAING_ST', 'EDU_TR_SD', 'DATETIME', '15'],
['EDC_TRAING_END', 'EDU_T_ED', 'DATETIME', '15'],
['EDC_PLACE_NM', 'EDU_PL_NM', 'VARCHAR2', '40'],
['ONLINE_REQST_POSBL_AT', 'ONLINE_REQ_P_A', 'VARCHAR2', '1']],
columns=['NAME', 'ID', 'TYPE', 'LEN'])
每个 df 都有这样的长度。
len(df_g) : 1000
len(df_n) : 5000
每个数据框都有名为'name, id, type, len'
我需要检查每个 df 中的那些列(名称、类型、len)以比较“id”列是否具有相同的值。
所以我这样试过。
for i in g.index:
for j in n.index:
g = g.iloc[i].values
# make it to ndarray
g_Str = g[0] + g[2] + g[3]
# make it to str for pivot
n = n.iloc[j].values
n_Str = n[0] + str(n[2]) + str(n[3])
# comparing and check two df
if g_Str == n_Str and g[1] != n[1]:
print(i, j)
print(g[0])
我有上面的代码用于 2 个不同长度的 DataFrame。 首先,我尝试使用 'iterrows()' 来比较这两个 df, 但是花了太多时间。(很慢)
我寻找了其他方法来使其性能更好。
我发现的可能方法
选项1 使用 to_dict() 将 df 转换为 dict / 比较嵌套 for-loop
中的那些选项2 将 df.series 转换为 ndarray / 比较嵌套 for-loop
中的那些
还有其他更好的选择吗? 或不使用嵌套 for 循环的任何选项?
谢谢。
你可以试试merge, 如果您正在寻找 ID 不匹配的记录,那么以下是实现它的一种方法:
r1=df_g.merge(df_n,on=['NAME', 'TYPE', 'LEN'],how='inner').query('ID_x != ID_y').rename(columns={'ID_x': 'ID'}).drop('ID_y', 1)
我使用过how="inner" join,但根据需要可以使用以下任意一种join: {‘left’, ‘right’, ‘outer’, ‘inner’, ‘cross’}, 默认‘inner’