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

2024-10-01 07:21:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很大的数据帧(Output\ u Frame),其中的列由两个字符串的列表定义:

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

我想将这些列重命名为包含在另一个数据帧(键)中的单个字符串:

                                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\u Frame的列名是Key Frame的frields'Series\u Code'和'Datatype\u Code'。我想根据Name变量from Key重命名Output\框架中的列名。你知道吗

例如,输出帧中的第一列是:

('@:M3WRLD', 'AS1GRO')

我希望它变成:

MSCI AC WORLD - CAL FY1 GROWTH SAL

下面的synatx是不正确的,但我相信逻辑会工作。你知道吗

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和熊猫的新手,非常感谢你的帮助。你知道吗


Tags: keyworldoutputcodecolframeacrow
1条回答
网友
1楼 · 发布于 2024-10-01 07:21:41

基本上,您希望将dataframeoutput_frame的2级多索引列更改为将值映射到keydataframe中的值的单级索引列。我想说这是一个冒险的逻辑。您需要确保多索引的每一对项都存在于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具有多索引('@:AFM2M2', 'AS1GRO')('@:AFM2E2', 'AS1GRO'),但是df_key没有这些组合。因此,我选择将它们展平到@:AFM2M2 - AS1GRO@:AFM2E2 - AS1GRO,而不是将NaNNoNe分配到它们的位置。其次,示例output_frame具有重复的多索引列,因此映射也映射到重复的值。你知道吗

相关问题 更多 >