Python DataFrame:从另一个DataFrame重命名列

4

我有一个大型数据框(Output_Frame),其中的列由两个字符串列表定义:

output_frame.columns
Out[14]: 
MultiIndex([('@:M3WRLD', 'AS1GRO'),
            ('@:M3WRLD', 'AS1GRO'),
            ('@:AFM2M2', 'AS1GRO'),
            ('@:AFM2E2', 'AS1GRO'),
        ...
names=['Instrument', 'Field'], length=903)

我想将这些列重命名为包含在另一个DataFrame(Key)中的单个字符串。
                                Name Series_Code Datatype_Code  
0  MSCI AC WORLD - CAL FY1 GROWTH SAL    @:M3WRLD        AS1GRO  
1  MSCI AC WORLD - FY2 YOY GROWTH SAL    @:M3WRLD        AS2GRO  
2  MSCI AC WORLD - FY3 YOY GROWTH SAL    @:M3WRLD        AS3GRO  
3  MSCI AC WORLD - CAL FY1 YOY GROWTH    @:M3WRLD        AF1GRO  

再次强调:Output_Frame的列名是来自Key帧的字段'Series_Code'和'Datatype_Code'。我想根据Key中的Name变量重命名Output_Frame的列名。
例如,Output_Frame中的第一列是:
('@:M3WRLD', 'AS1GRO')

我希望它变成:

MSCI AC WORLD - CAL FY1 GROWTH SAL

以下语法是不正确的,但我相信逻辑可以实现。
for col in output_frame.columns:
    for row in key.rows:
        if (key[row, 'Series_Code'] == col[0]) && (key[row, 'Datatype_Code'] == col[1]):
            output_frame.column(col) = key[row, 'Type']

我希望能得到关于修复语法或者提出更好方法的建议,而且最好不需要迭代。我对Python和pandas都很生疏,非常感谢您的帮助。

1
df.rename(columns={'@:M3WRLD':df.loc[df['@:M3WRLD'].str.contains('@:M3WRLD')==True].tolist()[0]) 这段代码结构不是很清晰? - Umar.H
谢谢回复。我编辑了问题,使其更加清晰。Output_Frame包含903列 - 它们都需要重新命名。 - Tikhon
1
你能打印出数据框的前5行和5列吗?print(df.iloc[:5,:5])如果我理解正确,你需要用相应的值替换列名吗? - Umar.H
1个回答

1
你需要将数据框 output_frame 的二级多重索引列更改为单级索引列,其中的值映射到 key 数据框中的值。我认为这是一种有风险的逻辑。你需要确保每个多重索引的配对项都存在于 key 数据框中。但这是可行的。假设 key 数据框命名为 df_key。你可以执行以下操作:
Sample `output_frame` bases on your provided `multiindex` columns

Instrument @:M3WRLD        @:AFM2M2 @:AFM2E2
Field        AS1GRO AS1GRO   AS1GRO   AS1GRO
0                70     81       74       48

df_key
Out[539]:
                                 Name Series_Code Datatype_Code
0  MSCI AC WORLD - CAL FY1 GROWTH SAL    @:M3WRLD        AS1GRO
1  MSCI AC WORLD - FY2 YOY GROWTH SAL    @:M3WRLD        AS2GRO
2  MSCI AC WORLD - FY3 YOY GROWTH SAL    @:M3WRLD        AS3GRO
3  MSCI AC WORLD - CAL FY1 YOY GROWTH    @:M3WRLD        AF1GRO

#======================================================================
#create a dictionary from `df_key`
d = df_key.set_index(['Series_Code', 'Datatype_Code']).Name.to_dict()

##or
d = {tuple(v): k for k, *v in zip(*map(df_key.get, df_key))}

Out[526]:
{('@:M3WRLD', 'AS1GRO'): 'MSCI AC WORLD - CAL FY1 GROWTH SAL',
 ('@:M3WRLD', 'AS2GRO'): 'MSCI AC WORLD - FY2 YOY GROWTH SAL',
 ('@:M3WRLD', 'AS3GRO'): 'MSCI AC WORLD - FY3 YOY GROWTH SAL',
 ('@:M3WRLD', 'AF1GRO'): 'MSCI AC WORLD - CAL FY1 YOY GROWTH'}

#Use map on `output_dataframe.columns` to flatten and change its values to values from dictionary created from `df_key`
output_frame.columns = output_frame.columns.map(lambda x:  
                                                d.get(tuple(x), f'{x[0]} - {x[1]}'))


Out[534]:
   MSCI AC WORLD - CAL FY1 GROWTH SAL  MSCI AC WORLD - CAL FY1 GROWTH SAL  \
0                                  70                                  81

   @:AFM2M2 - AS1GRO  @:AFM2E2 - AS1GRO
0                 74                 48

注意:如我所说,您必须确保每个多重索引的成对项存在于“key”数据帧中。您的示例“output_frame”具有mutiindex“('@:AFM2M2','AS1GRO')”和“('@:AFM2E2','AS1GRO')”,但“df_key”没有这些组合。因此,我选择将它们展平为“@:AFM2M2-AS1GRO”和“@:AFM2E2-AS1GRO”,而不是将“NaN”或“NoNe”分配到它们的位置。其次,您的示例“output_frame”具有重复的mutiindex列,因此映射也映射到了重复的值。

1
谢谢,伙计,它起作用了(我想)- 但是我要死了,如果我不明白为什么。在整个程序中,每个列名列表都有一个唯一的名称与之相关联。 - Tikhon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接