Python:批量处理DataFrame列表的列筛选与重命名失败问题
解决DataFrame循环处理未生效的问题
这个问题我之前也碰到过,其实核心原因是你在循环里的赋值操作没有同步到原列表的元素上。让我给你拆解一下:
当你写for df in base_df:的时候,df只是一个临时变量,一开始它指向列表里的某个DataFrame对象,但当你执行df = df[rename_cols_list].rename(...)时,这个df就变成了一个新的DataFrame对象的引用,原列表base_df里的元素还是原来的那个未修改的DataFrame,自然看不到变化。
下面给你两种简单有效的解决方案:
方案1:用列表推导式重新生成列表(推荐)
这是最Pythonic的方式,直接生成一个包含所有处理后DataFrame的新列表:
rename_cols_list = ['Portfolio', 'CalendarYear', 'Count'] rename_cols_dict = {'Portfolio': 'Index', 'CalendarYear': 'Year', 'Count': 'Constituents'} base_df = [ df[rename_cols_list].rename(rename_cols_dict, axis='columns') for df in base_df ]
这样处理后,base_df里的每个元素都是已经完成筛选和重命名的DataFrame了。
方案2:通过索引修改原列表元素
如果你不想重新赋值base_df变量,可以通过遍历列表索引的方式,直接替换对应位置的元素:
for i in range(len(base_df)): base_df[i] = base_df[i][rename_cols_list].rename(rename_cols_dict, axis='columns')
这种方式会直接修改原列表中的每个元素,不需要创建新的列表对象。
另外补充一点:别想着用rename的inplace=True参数来“原地修改”,因为df[rename_cols_list]本身已经返回了一个原DataFrame的切片副本,对这个副本做inplace修改并不会影响原列表里的对象,所以还是得通过赋值来更新列表元素。
内容的提问来源于stack exchange,提问作者malligator
相关产品推荐
相关产品推荐

