Ale*_*lex 4 python merge dataframe python-3.x pandas
我正在按关键列顺序合并一些数据框,但我发现这些列没有按预期使用后缀参数重命名。我使用的是 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 文档没有建议,这应该是结果。的预期结果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 序列 (tuple, list, ...) 后缀分别应用于左侧和右侧的重叠列名
这里的关键词是重叠。
当您合并df0和df1上serial_num,每一帧都有一个vals,这成为vals_df0与vals_df1因为后缀。
然后您将一个带有列的框架与['serial_num', 'vals_df0', 'vals_df1']具有['serial_num', 'vals'].  vals两者都不存在,所以不需要使用任何后缀来区分,我们得到['serial_num', 'vals_df0', 'vals_df1', 'vals'].
如果您希望将后缀应用于每个非共享列,则必须手动执行此操作——这不是suffixes参数的用途。
| 归档时间: | 
 | 
| 查看次数: | 2632 次 | 
| 最近记录: |