pandas中for循环使用melt和rename操作DataFrame不生效如何解决?
问题原因
- 你在循环中拿到的
df只是原df1/df2/df3/df4对象的临时引用,对df执行df = df.melt(...)这类重新赋值操作,只会把临时变量指向新生成的DataFrame对象,不会修改原df1等全局变量的指向,也不会改动data_files列表中存储的原始对象引用。 - 你调用
rename时设置了inplace=False,该参数本身就会返回新的DataFrame对象,不会修改原输入的df。
可行实现方案
方案1:将处理结果存入新列表(更推荐,易维护)
适合后续需要批量使用/合并处理后数据的场景:
data_files = [df1, df2, df3, df4] names = ['child_mortality','income','life_expectancy','population'] processed_dfs = [] # 用zip同时遍历df列表和列名列表,不需要手动维护i计数 for df, val_name in zip(data_files, names): temp_df = df.melt(['country'], var_name='year') temp_df = temp_df.rename(columns = {'value': val_name}) processed_dfs.append(temp_df) # 按索引取用即可,比如processed_dfs[0]对应原df1的处理结果
方案2:直接修改原df变量
如果必须保留df1/df2这类变量名直接调用的使用习惯,可以操作全局变量字典实现:
names = ['child_mortality','income','life_expectancy','population'] df_var_names = ['df1', 'df2', 'df3', 'df4'] for var_name, val_name in zip(df_var_names, names): # 从全局变量中取出原df df = globals()[var_name] # 执行处理逻辑 df = df.melt(['country'], var_name='year') df = df.rename(columns = {'value': val_name}) # 把处理后的df写回全局变量 globals()[var_name] = df # 此时直接打印df1就是处理后的结果
内容的提问来源于stack exchange,提问作者Mostafa Sakr
相关产品推荐
相关产品推荐

