Pandas:合并(join)多个列上的两个数据帧

我试图加入两个熊猫数据帧使用两列:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

但得到了以下错误:

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4164)()


pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4028)()


pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13166)()


pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13120)()


KeyError: '[B_1, c2]'

你知道正确的方法是什么吗?谢谢!

802489 次浏览

试试这个

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

left_on:标签或列表,或数组类型的字段名,以连接在左侧 DataFrame。可以是向量的长度或向量的列表 DataFrame使用特定的向量作为连接键,而不是 列< / p >

right_on:标签或列表,或类似数组的字段名 在右DataFrame或vector/ vector列表中,每个left_on docs

这里的问题是,通过使用撇号,您正在将传递的值设置为字符串,而实际上,正如文档中@Shijo所述,该函数期望的是标签或列表,而不是字符串!如果列表包含传递给左右数据框架的每个列的名称,则每个列名必须单独在撇号中。根据上面所说的,我们可以理解为什么这是不正确的:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

下面是正确使用函数的方法:

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])

另一种表达方式:

new_df = A_df.merge(B_df, left_on=['A_c1','c2'], right_on = ['B_c1','c2'], how='left')

你可以用下面的句子,这句话简短易懂:

merged_data= df1.merge(df2, on=["column1","column2"])

这对我来说是可行的,对于n个文件XLS

All_reports_paths包含一个数组,每个文件包含所有路径

对于all_reports_paths中的a:

df。追加(pd.read_excel (skiprows = X, skipfooter = X))

df_glob = pd.DataFrame(columns=columns)

对于df中的dataframe:

df_glob = pd.concat([df_glob,pd.DataFrame(dataframe)],轴=0)

最后df_glob包含所有数据