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

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

我顺序地通过键列合并一些数据帧,但是我发现并没有按期望的那样使用后缀参数对列进行重命名。我正在使用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吗?熊猫是否在其他所有调用中都无法通过后缀参数重命名列?

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
投票

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


0
投票

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

将熊猫作为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)

print(df_01.columns)

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

print(df_02.columns)

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

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