[英]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
而不是将NaN
或NoNe
分配给它们的位置。 其次,您的示例output_frame
具有重复的 mutiindex 列,因此映射也映射到重复的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.