Python 熊猫加入数据帧强制后缀?

Python 熊猫加入数据帧强制后缀?,python,pandas,Python,Pandas,如何在合并或联接上强制使用后缀。我知道,如果发生冲突,可以提供一个后缀,但在我的例子中,我正在合并df1和df2,这不会导致任何冲突,但在使用后缀的df2上再次合并,但我更希望每个合并都有一个后缀,因为如果我像你想象的那样进行不同的组合,这会让人感到困惑。你可以强制实际数据帧上的后缀: In [11]: df_a = pd.DataFrame([[1], [2]], columns=['A']) In [12]: df_b = pd.DataFrame([[3], [4]], columns=

如何在合并或联接上强制使用后缀。我知道,如果发生冲突,可以提供一个后缀,但在我的例子中,我正在合并df1和df2,这不会导致任何冲突,但在使用后缀的df2上再次合并,但我更希望每个合并都有一个后缀,因为如果我像你想象的那样进行不同的组合,这会让人感到困惑。

你可以强制实际数据帧上的后缀:

In [11]: df_a = pd.DataFrame([[1], [2]], columns=['A'])

In [12]: df_b = pd.DataFrame([[3], [4]], columns=['B'])

In [13]: df_a.join(df_b)
Out[13]: 
   A  B
0  1  3
1  2  4
通过将以下内容附加到列的名称:

In [14]: df_a.columns = df_a.columns.map(lambda x: str(x) + '_a')

In [15]: df_a
Out[15]: 
   A_a
0    1
1    2
现在连接不需要后缀更正,无论它们是否碰撞:

In [16]: df_b.columns = df_b.columns.map(lambda x: str(x) + '_b')

In [17]: df_a.join(df_b)
Out[17]: 
   A_a  B_b
0    1    3
1    2    4

当已有同名列时,Pandas merge将为新列提供后缀,当我需要使用后缀强制新列时,我将创建一个空列,其中包含我要加入的列的名称

df["colName"] = "" #create empty column 
df.merge(right = "df1", suffixes = ("_a","_b"))
您可以稍后删除空列


您可以对多个列或df.columns.values中的每一列执行相同的操作

这是我用来
pandas.merge
两个数据帧并强制后缀的操作:

def merge_force_suffix(left, right, **kwargs):
    on_col = kwargs['on']
    suffix_tupple = kwargs['suffixes']

    def suffix_col(col, suffix):
        if col != on_col:
            return str(col) + suffix
        else:
            return col

    left_suffixed = left.rename(columns=lambda x: suffix_col(x, suffix_tupple[0]))
    right_suffixed = right.rename(columns=lambda x: suffix_col(x, suffix_tupple[1]))
    del kwargs['suffixes']
    return pd.merge(left_suffixed, right_suffixed, **kwargs)

从0.24.2版开始,您可以使用以下方法为数据帧上的列名添加后缀

这使得带有强制后缀的一行合并命令更容易接受,例如:


df_merged=df1.merge(df2.add_后缀(“_2”))

为什么不将df1和df2合并或附加在一起,而是重命名df2中的冲突列,以便识别原始数据的来源?请参阅我的答案,了解使用0.24.2中添加的更新版本。我现在正在执行此操作。我想最后,保存步骤并为join/merge函数提供后缀会更好。我将把这个标记为正确答案。谢谢。不用使用
lambda
,只需添加到列索引--
df_a.columns+=“_a”
,如果它们都是字符串。或者添加
df_a.columns.astype(“str”)+“_a”
,如果不是的话。@DSM会在适当的位置修改列名称吗?我的目标不是就地修改,而是临时修改them@stgtscc当前位置它将做与安迪的回答完全相同的事情。如果您想更改不在适当位置的列名,可以执行
df_a.rename(columns=lambda x:x+“_a”).join(df_b.rename(columns=lambda x:x+“_b”)
或其他操作。这将是在pandas中合并的一个不错的添加。但是,在合并之前,您会遇到列名更改的问题