Python Pandas合并(和连接)是否无法通过sufffix参数重命名列?

问题描述 投票:1回答:3

我通过键列顺序合并一些数据帧,但我发现没有使用suffix参数重命名列。我使用的是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 = 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)

返回:

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是否未通过后缀参数重命名列?

python python-3.x pandas dataframe merge
3个回答
3
投票

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

后缀:2长度序列(元组,列表,...)后缀分别适用于左侧和右侧的重叠列名称

这里的关键词是重叠的。

当您在df0上合并df1serial_num时,每个帧都有一个vals,由于后缀而变成vals_df0vals_df1

然后你将一个框架与列['serial_num', 'vals_df0', 'vals_df1']和一个有['serial_num', 'vals']的框架合并。 vals两者都不存在,因此不需要使用任何后缀来区分它,我们得到['serial_num', 'vals_df0', 'vals_df1', 'vals']

如果要将后缀应用于每个非共享列,则必须手动执行 - 这不是suffixes参数的用途。


2
投票

仅在合并的数据框具有相同名称的列的情况下使用后缀关键字,它确保每列具有唯一的名称。在第二次合并中,您将df01与列'serial_num','vals_df0','vals_df1'和df2合并为列'serial_num','val'。除了要合并的'serial_no'之外,你没有任何重复的列名,所以你最终得到'serial_num','vals_df0','vals_df1','vals'


0
投票

以下是您正在寻找的更新:在R中我们可以结合早期的输出但是在python中我们需要执行以下操作:

将pandas导入为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”,后缀=(“_ df0”,“_ df1”),copy = True)

打印(df_01.columns)

df_02 = pd.merge(df1,df2,on =“serial_num”,后缀=(“_ df1”,“_ df2”),copy = True)

打印(df_02.columns)

df_final = pd.merge(df_01,df_02,copy = True)

© www.soinside.com 2019 - 2024. All rights reserved.