Pandas合并返回带有_x后缀的列名
我有两个数据表,df1 有列 A, B, C, D...,而 df2 有列 A, B, E, F...
我想用 A 列里的值来合并这两个数据表。B 列在这两个数据表里也很可能是一样的。因为数据量很大,所以我还没有完全搞清楚所有的内容。
当我执行
pd.merge(df1, df2, on='A')
时,结果里出现了一个叫 B_x 的列。由于数据集很大而且比较复杂,我还没去研究 B_x 和 df1 里的 B 以及 df2 里的 B 有什么不同。
所以我想问的是:在合并后的数据表中,Pandas 在列名后面加上 _x 是什么意思呢?
相关问题:
2 个回答
合并的数据表格不应该有重复的列名。正如EdChum提到的,如果合并后的数据表里出现了 B_x,而不是 B,这就说明原来的两个数据表都有一个叫 B 的列。为了区分,pandas自动给左边的数据表的 B 列加了后缀 _x,而右边的数据表的 B 列则加了后缀 _y。
其实,你可以通过给 merge() 函数的 suffixes= 参数传递一个元组,来改变这些后缀的名称。例如:
merged_df = df1.merge(df2, on='A', suffixes=('_left', '_right'))
这样,合并后的数据表 merged_df 就会用 B_left 来代替 B_x。如果你传递空字符串:
df1.merge(df2, on='A', suffixes=('', ''))
你会得到一个类似于以下的ValueError错误提示:
ValueError: columns overlap but no suffix specified: Index(['B'], dtype='object')
这个提示说明发现了重复的列。
后缀是为了处理在合并操作中,不同列名之间的冲突。具体可以查看在线文档。
所以在你的情况下,如果你觉得这两列是一样的,你可以在这两列上进行合并:
pd.merge(df1, df2, on=['A', 'B'])
不过这样做的结果是只会返回在两个数据框中都存在的和的值,因为默认的合并方式是inner合并。
你可以比较一下这个合并后的数据框的大小和第一个数据框的大小,看看它们是否相同。如果相同的话,你可以在这两列上进行合并,或者直接去掉/重命名带有_x/_y后缀的列。
不过我建议你先花点时间确认这些值确实是相同的,并且在两个数据框中都存在,这样的话你可能想要进行outer合并:
pd.merge(df1, df2, on=['A', 'B'], how='outer')
然后你可以去掉重复的行(可能还要去掉任何NaN行),这样就能得到一个干净的合并数据框。
merged_df.drop_duplicates(cols=['A', 'B'],inplace=True)
有关更多信息,请查看drop_duplicates的在线文档。