[英]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.