如何使用函数原地(inplace)修改多个同结构的Pandas DataFrame?
如何原地修改多个Pandas DataFrame并保存转换
虚拟DataFrame示例
先定义两个结构一致的DataFrame:
import pandas as pd df = pd.DataFrame({ "Full name": ["John Doe","Deep Smith","Julia Carter","Kate Newton","Sandy Thompson"], "Monthly Sales": [25,30,35,40,45] }) df2 = pd.DataFrame({ "Full name": ["Alicia Williams","Kriten John","Jessica Adams","Isaac Newton","Whitney Gordon"], "Monthly Sales": [35,20,50,15,40] })
原函数的问题
你原本的函数无法实现原地修改,核心问题是操作都是对局部变量df重新赋值,没有改动原始传入的DataFrame对象:
def tidy_dfs(dfs): for df in dfs: # Drop first row df = df.iloc[1: , :] # 仅给局部变量赋值新切片,原DataFrame无变化 # Replace spaces in columns df.columns = [c.replace(' ', '_') for c in df] # 修改的是新切片的列名,与原对象无关 # change cols to lower df.columns = [c.lower() for c in df] return df
即便用df,df2 = tidy_dfs([df,df2])也无效,因为循环内的操作从未影响原始DataFrame。
修改后的原地修改函数
要实现原地修改,需直接对原DataFrame对象执行操作:
- 删除首行:用
drop方法并设置inplace=True,直接修改原对象 - 修改列名:直接修改原df的
columns属性(它是可变对象,修改会同步到原DataFrame)
修改后的函数:
def tidy_dfs(dfs): for df in dfs: # 原地删除第一行 df.drop(df.index[0], inplace=True) # 原地替换列名空格并转为小写 df.columns = [c.replace(' ', '_').lower() for c in df.columns]
调用验证
直接传入DataFrame列表即可完成原地修改:
tidy_dfs([df, df2])
此时查看df和df2会发现:
- 首行已被删除
- 列名从
Full name变为full_name,Monthly Sales变为monthly_sales
内容的提问来源于stack exchange,提问作者Mohamed Mostafa El-Sayyad
相关产品推荐
相关产品推荐

