簡體   English   中英

Python DataFrame:重命名另一個 DataFrame 中的列

[英]Python DataFrame: rename columns from another DataFrame

我有一個大型 DataFrame (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 的列名是關鍵幀中的字段“Series_Code”和“Datatype_Code”。 我想根據 Key 的 Name Variable 重命名 Output_Frame 中的列名。

例如,Output_Frame 中的第一列是:

('@: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 和 Pandas 的新手,非常感謝您的幫助。

您基本上想將數據幀output_frame 2 級多索引列更改為單級索引列,其中值映射到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

注意:正如我所說,您必須確保 multindex 的每個配對項都存在於key dataframe 中 您的示例output_frame具有 mutiindex ('@:AFM2M2', 'AS1GRO')('@:AFM2E2', 'AS1GRO') ,但df_key沒有這些組合。 因此,我選擇將它們展平為@:AFM2M2 - AS1GRO@:AFM2E2 - AS1GRO而不是將NaNNoNe分配給它們的位置。 其次,您的示例output_frame具有重復的 mutiindex 列,因此映射也映射到重復的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM