Skip to main content
 首页 » 编程设计

python之Python Pandas 合并(和连接)是否无法通过后缀参数重命名列

2025年05月04日23freeliver54

我正在按键列顺序合并一些数据帧,但我发现这些列没有按预期使用后缀参数重命名。我正在使用 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) 

结果是:

Index(['serial_num', 'vals_df0', 'vals_df1'], dtype='object') 
Index(['serial_num', 'vals_df0', 'vals_df1', 'vals'], dtype='object') 

这很奇怪,因为 Pandas documentation on merge不建议,这应该是结果。 print(df_012.columns) 的预期结果是 Index(['serial_num', 'vals_df0_foobar', 'vals_df1_foobar', 'vals_df2'], dtype='object')。看起来数据结果确实是正确的。我尝试了几种方法,包括 copy = True、copy.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) 

返回:

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') 

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

请您参考如下方法:

suffixes 参数仅用于区分共享但我们不合并的名称。如文档所述:

suffixes : 2-length sequence (tuple, list, ...) Suffix to apply to overlapping column names in the left and right side, respectively

这里的关键词是重叠。

当你在 serial_num 上合并 df0 和 df1 时,每一帧都有一个 vals,它变成了 vals_df0 和 vals_df1 因为后缀。

然后您将包含列 ['serial_num', 'vals_df0', 'vals_df1'] 的框架与具有 ['serial_num', 'vals'] 的框架合并. vals 两者都不存在,所以不需要用任何后缀来区分,得到['serial_num', 'vals_df0', 'vals_df1', 'vals'] 。

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