Python Pandas 合并(和连接)是不是无法通过后缀参数重命名列?
Posted
技术标签:
【中文标题】Python Pandas 合并(和连接)是不是无法通过后缀参数重命名列?【英文标题】:Does Python Pandas merge (and join) fail to rename columns by suffix argument?Python Pandas 合并(和连接)是否无法通过后缀参数重命名列? 【发布时间】:2017-10-17 13:27:51 【问题描述】:我正在按一个键列顺序合并一些数据帧,但我发现这些列没有按预期使用 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 = 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 是否无法在所有其他调用中通过 suffix 参数重命名列?
【问题讨论】:
【参考方案1】:suffixes
参数仅用于区分共享但我们未合并的名称。正如文档所解释的:
suffixes : 2-length 序列 (tuple, list, ...) 应用于左右重叠列名的后缀 侧面,分别
这里的关键词是重叠。
当您在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
参数的用途。
【讨论】:
哦,现在很清楚了!所以答案是肯定的,虽然熊猫“未能”重命名该列,但以一种非常合理和精确的方式。这只是意味着顺序合并具有相同列名的数据框最终需要手动重命名某些列。最好有一个标志来强制列重命名。谢谢!【参考方案2】:Suffixes 关键字仅在合并的数据框具有相同名称的列的情况下使用,它确保每列具有唯一的名称。 在第二次合并中,您将 df01 与列“serial_num”、“vals_df0”、“vals_df1”和 df2 与列“serial_num”、“val”合并。 除了要合并的“serial_no”之外,您没有任何重复的列名,因此您最终会得到“serial_num”、“vals_df0”、“vals_df1”、“vals”
【讨论】:
【参考方案3】:使用join
时,可以将lsuffix留空,直到最后的join,这样所有的join都会导致名字冲突,从而重命名右侧DataFrame的列。
【讨论】:
以上是关于Python Pandas 合并(和连接)是不是无法通过后缀参数重命名列?的主要内容,如果未能解决你的问题,请参考以下文章