熊猫合并意外产生后缀

Posted

技术标签:

【中文标题】熊猫合并意外产生后缀【英文标题】:Pandas merge unexpectedly produces suffixes 【发布时间】:2020-10-27 22:37:06 【问题描述】:

我正在将两个 Pandas DataFrame 合并在一起,并得到“_x”和“_y”后缀。易于复制下面的示例。我尝试将, suffixes=(False, False) 添加到合并中,但它返回错误:ValueError: columns overlap but no suffix specified: Index(['f1', 'f2', 'f3'], dtype='object')。我必须在这里遗漏一些明显的东西?我理解为什么使用 join 会发生这种情况,但我没想到它会用于合并。

请忽略复制切片错误。我不知道为什么它没有在第 10 行抛出这个错误,而是在第 17 行抛出它。(如果你知道,上面有一个悬而未决的问题here!)

系统详情: 视窗 10 康达 4.8.2 Python 3.8.3 熊猫 1.0.5 py38he6e81aa_0 conda-forge

import pandas as pd

#### Build an example DataFrame for easy-to-replicate example ####
myid = [1, 1, 1, 2, 2]
myorder = [3, 2, 1, 2, 1]
y = [3642, 3640, 3632, 3628, 3608]
x = [11811, 11812, 11807, 11795, 11795]
df = pd.DataFrame(list(zip(myid, myorder, x, y)), 
                  columns =['myid', 'myorder', 'x', 'y']) 
df.sort_values(by=['myid', 'myorder'], inplace=True) #Line10
df.reset_index(drop=True, inplace=True)
display(df.style.hide_index())

### Typical analysis on existing DataFrame, Error occurs in here ####
for id in df.myid.unique():
    tempdf = df[mygdf.myid == id]
    tempdf.sort_values(by=['myid', 'myorder'], inplace=True) #Line17
    tempdf.reset_index(drop=True, inplace=True)
    for i, r in tempdf.iloc[1:].iterrows():
        ## in reality, calling a more complicated function here
        ## this is just a simple example
        tempdf.loc[i, 'f1'] = tempdf.x[i-1] - tempdf.x[i]
        tempdf.loc[i, 'f2'] = tempdf.y[i-1] - tempdf.y[i]
        tempdf.loc[i, 'f3'] = tempdf.y[i] +2
   
    what_i_care_about = ['myid', 'myorder', 'f1', 'f2', 'f3']

    df = pd.merge(df, tempdf[what_i_care_about], 
                  on=['myid', 'myorder'], how='outer')
    del tempdf

display(df.style.hide_index())

【问题讨论】:

【参考方案1】:

您的问题是您没有合并的列对于两个源 DataFrame 都是通用的。 Pandas 需要一种方式来说明哪个来自哪里,所以它添加了后缀,默认为左侧的 '_x' 和右侧的 '_y'

如果您对保留列的源数据框有偏好,那么您可以设置后缀并相应地进行过滤,例如,如果您想保留左侧的冲突列:

# Label the two sides, with no suffix on the side you want to keep
df = pd.merge(
    df, 
    tempdf[what_i_care_about], 
    on=['myid', 'myorder'], 
    how='outer',
    suffixes=('', '_delme')  # Left gets no suffix, right gets something identifiable
)
# Discard the columns that acquired a suffix
df = df[[c for c in df.columns if not c.endswith('_delme')]]

或者,您可以在合并之前删除每个冲突列中的一个,这样 Pandas 就无需分配后缀。

【讨论】:

有道理,我正在合并加入和合并。我想我想要的是合并所有列,所以我应该放弃on=... 标准。谢谢

以上是关于熊猫合并意外产生后缀的主要内容,如果未能解决你的问题,请参考以下文章

熊猫内部合并/加入返回所有行

熊猫将数字转换为字符串 - 意外结果

熊猫合并101

熊猫合并101

熊猫合并101

熊猫合并返回 NaN