合并Pandas中的两个数据帧将在合并结果中创建所有两个数据帧列

2024-09-23 22:25:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图根据三列TRADE_IDTRADE_SUB_IDhelper使用df2离开merge{}^创建{}列是为了在合并时避免重复行。在执行merge函数之前,df1有44列。在merge之后,df1现在有122列

df1 = df1.merge(df2, how='left', on=['ID', 'SUB_ID', 'helper'], indicator='Result')

df1['Result'] = df1['Result'].map({
    'both': np.nan,
    'left_only': 'under-reporting',
    'right_only': np.nan
})

我想问一下,我是否可以在不创建重复列的情况下进行合并。非常感谢你

编辑: df1看起来像这样:

            ID       SUB_ID  ...                          TIMESTAMP helper
250   G0000001           F1  ...                          48:04.6      0
251   G0000002           F1  ...                          51:25.1      0
252   G0000003           F1  ...                          54:10.6      0
253   G0000006           F1  ...                          03:17.1      0
254   G0000008           F1  ...                          09:23.2      0
       ...          ...  ...                              ...    ...
8610  G0000004           N1  ...                          39:58.2      0
8611  G0000005           F1  ...                          39:58.2      0
8612  G0000005           N1  ...                          39:58.2      0
8641  G0000010           F1  ...                          41:54.1      0
8642  G0000020           N1  ...                          41:54.1      0

[248 rows x 44 columns]

而且df2看起来是这样的:

           Type        Primary Key  ...         SUB_ID helper
0          Trade   G000002.00NTSN  ...           00      0
1          Trade  G0000003.F10NTSN  ...           F1      0
2          Trade  G0000006.F10NTSN  ...           F1      0
3          Trade  G0000005.N10NTSN  ...           N1      0
4          Trade  G0000006.F10NTSN  ...           F1      0
..           ...                         ...  ...          ...    ...
163        Trade  G0000007.F10NTSN  ...           F1      0
164        Trade  G0000004.F10NTSN  ...           F1      0
166        Trade  G0000014.F10NTSN  ...           F1      0
167        Trade  G0000006.N10NTSN  ...           N1      0
168        Trade  G0000008.F10NTSN  ...           F1      1

[167 rows x 80 columns]

Tags: helperidresultmergeleftf1df1df2
3条回答

当您执行DataFrame.merge时,您正在合并您命名的列列表等上的两个数据帧。当您执行左合并(SQL等效的左联接)时,您保留了所有左表键,但仍然将右数据帧中的所有列放入合并中

我的建议是明确声明您想要的列,这可能不是最好的解决方案,但它会起作用

大意是:

COLLIST = [FILL THIS WITH THE COLUMNS YOU WANT]
df2 = df2[[COLLIST]]
df1 = df1.merge(df.2, how = 'left', on = COLLIST)

注意,只有当df2中的所有列都是您想要保留的列时,这才有效

如果有不同的列,则相同的概念可以工作,只需使用两个不同的列列表即可

也许有更好的办法,但这就是我解决这个问题的方法

编辑以快速添加您甚至可以通过编程方式拖动列列表来设置列列表:

collist = df1.index.tolist()

如果两个数据帧中的重复列相同,则应将它们添加到on列表中。如果您有名称相同但数据不同的列,并且只想保留其中的一部分,则可以合并数据帧的片段。比如说

df1= df1[['ID', 'SUB_ID', 'helper', col1, col2, col3]].merge(df2[['ID', 'SUB_ID', 'helper', col4]], how='left', on=['ID', 'SUB_ID', 'helper'], indicator='Result')

将从{}而不是{}和{}从{}而不是{}向您提供{}、{}和{}

这并不完全是您想要的答案,但您可以轻松地在事后处理重复的列

你能行

choice = "duplicate_column_name"

### OR ###

choice = ["duplicate_column_name_1", "duplicate_column_name_2", ...]

df.drop(choice, axis=1 , inplace = True)

或者,如果倒过来比较容易,您可以保留任意一列

df = df[['column_1','column_2']]

如果我不得不猜测您的问题的解决方案是,您的一个表中存在某种重复条目

相关问题 更多 >