繁体   English   中英

如何在循环中重命名 Pandas DataFrame 中的列?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM