[英]How to rename columns in Pandas DataFrame in loop?
我尝试在循环中合并多个数据帧。 我的代码是:
my_dict = {
'1':{
'providers_using':{
'providers':['prov1','prov2','prov3'],
'calls_count':[10,20,30]
}
},
'2':{
'providers_using':{
'providers':['prov1','prov2','prov3'],
'calls_count':[100,200,300]
}
},
'3':{
'providers_using':{
'providers':['prov1','prov2','prov3'],
'calls_count':[1000,2000,3000]
}
}
}
df_joined = pd.DataFrame(columns = ['providers','calls_count'])
for i in range(1,4):
gw_df = pd.DataFrame.from_dict(my_dict[str(i)]['providers_using'])
gw_df.rename(columns={"calls_count":"gw" + str(i)})
df_joined = pd.merge(df_joined,gw_df,left_on='providers',right_on = 'providers',how='outer')
print(df_joined)
结果是:
calls_count_x providers calls_count_y calls_count_x calls_count_y
0 NaN prov1 10 100 1000
1 NaN prov2 20 200 2000
2 NaN prov3 30 300 3000
但我希望将名称列“calls_count”设为 gw1、gw2、gw3 等。循环中的步数可能是随机的,因此不可接受,只需执行以下操作:
df_joined.columns = ['gw1','gw2','gw3']
预期输出为:
providers gw1 gw3 gw3
0 prov1 10 100 1000
1 prov2 20 200 2000
2 prov3 30 300 3000
顺便说一句 - 为什么列名是 "calls_count_y","calls_count_x" ?
下面是诀窍。 您还可以重命名列。 这个想法是根据名称gw + str(i)
创建一个列列表并创建一个列列表。
col = []
for i in range(1,4):
col.append("gw" + str(i))
gw_df = pd.DataFrame.from_dict(my_dict[str(i)]['providers_using'])
df_joined = pd.merge(df_joined,gw_df,left_on='providers',right_on = 'providers',how='outer')
df_joined.columns = ['providers'] + col
print(df_joined)
编辑:根据熊猫合并的文档,后缀将是 _x 和 _y。
这是一种无需循环即可从初始字典中获取预期输出的方法:
(pd.concat({k: pd.DataFrame(v).T.apply(pd.Series.explode) # unnest the lists
for k,v in my_dict.items()})
.reset_index() # dict keys as column
.pivot(index='providers', # pivot the calls count
columns='level_0',
values='calls_count')
.add_prefix('gw') # rename columns
.rename_axis('', axis=1) # remove 'level_0' name
.reset_index() # index as column
)
输出:
providers gw1 gw2 gw3
0 prov1 10 100 1000
1 prov2 20 200 2000
2 prov3 30 300 3000
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.