gpt4 book ai didi

Python 数据帧 : rename columns from another DataFrame

转载 作者:行者123 更新时间:2023-12-02 09:55:53 24 4
gpt4 key购买 nike

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

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

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

                                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 中的名称变量重命名 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 的新手,非常感谢您的帮助。

最佳答案

您基本上希望将数据帧 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
<小时/>

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

关于Python 数据帧 : rename columns from another DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59462406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com