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