Python Pandas 合并(和加入)是否无法按后缀参数重命名列?

Ale*_*lex 4 python merge dataframe python-3.x pandas

我正在按关键列顺序合并一些数据框,但我发现这些列没有按预期使用后缀参数重命名。我使用的是 Python 3.5 和 Panadas 0.19.2。

import pandas as pd
df0 = pd.DataFrame({'serial_num': ['01', '02', '03'], 'vals': ['A2', 'A3', 'A6']})
df1 = pd.DataFrame({'serial_num': ['01', '02', '03'], 'vals': ['B2', 'B3', 'B6']})
df2 = pd.DataFrame({'serial_num': ['01', '02', '03'], 'vals': ['C2', 'C3', 'C6']})

df_01 = pd.merge(df0, df1, on="serial_num", suffixes=("_df0","_df1"), copy=True)
print(df_01.columns)
df_012 = pd.merge(df_01, df2, on="serial_num", suffixes=("_foobar","_df2"), copy=True)
print(df_012.columns)
Run Code Online (Sandbox Code Playgroud)

结果是:

Index(['serial_num', 'vals_df0', 'vals_df1'], dtype='object')
Index(['serial_num', 'vals_df0', 'vals_df1', 'vals'], dtype='object')
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为关于合并Pandas 文档没有建议,这应该是结果。的预期结果print(df_012.columns)Index(['serial_num', 'vals_df0_foobar', 'vals_df1_foobar', 'vals_df2'], dtype='object')。看起来数据结果是正确的。我试过几件事情,包括copy = Truecopy.deepcopy(merged_df),和copy.deepcopy(merged_df)。使用 join ( df_01 = df0.join(df1, on="serial_num", lsuffix="_df0", rsuffix="_df1") 给出类似的结果。它变得奇怪,顺序合并最终会重命名列:

df3 = pd.DataFrame({'serial_num': ['01', '02', '03'], 'vals': ['D2', 'D3', 'D6']})
df_0123 = pd.merge(df_012, df3, on="serial_num", suffixes=("","_df3"), copy=True)
print(df_0123.columns)
df_01230 = pd.merge(df_0123, df1, on="serial_num", suffixes=("_foo","_bar"), copy=True)
print(df_01230.columns)
Run Code Online (Sandbox Code Playgroud)

返回:

Index(['serial_num', 'vals_df0', 'vals_df1', 'vals', 'vals_df3'], dtype='object')
Index(['serial_num', 'vals_df0', 'vals_df1', 'vals_foo', 'vals_df3',
   'vals_bar'],
  dtype='object')
Run Code Online (Sandbox Code Playgroud)

如果您遵循所有这些,您是否和我一样惊讶合并突然将 vals 重命名为 vals_foo?Pandas 是否无法在所有其他调用中通过后缀参数重命名列?

DSM*_*DSM 6

suffixes参数仅用于区分共享但我们不合并的名称。正如文档解释的那样:

suffixes : 2-length 序列 (tuple, list, ...) 后缀分别应用于左侧和右侧的重叠列名

这里的关键词是重叠

当您合并df0df1serial_num,每一帧都有一个vals,这成为vals_df0vals_df1因为后缀。

然后您将一个带有列的框架与['serial_num', 'vals_df0', 'vals_df1']具有['serial_num', 'vals']. vals两者都不存在,所以不需要使用任何后缀来区分,我们得到['serial_num', 'vals_df0', 'vals_df1', 'vals'].

如果您希望将后缀应用于每个非共享列,则必须手动执行此操作——这不是suffixes参数的用途。