修改Pandas DataFrame未保留指定列且原变量未更新问题求助
问题原因
- 你代码中
df = df[['Latitude','Longitude','temp']]是生成了一个新的DataFrame对象,仅将函数内的局部变量df指向这个新对象,并不会修改传入的原始DataFrame对象本身 - 列表推导式中你将函数返回的新DataFrame替换了
weather_list的原有元素,因此列表内的是处理完成的新对象,但你外部定义的独立DataFrame变量仍然指向未被修改的旧对象,所以出现数据不同步的问题 - 如果你打印
weather_list内任意DataFrame的列名,会发现已经仅保留了目标三列,所谓“无法删除datetime列”实际是你查看了外部未更新的旧变量导致的误解
解决方案
方案1:直接修改原始DataFrame对象(实现列表、外部变量同步更新)
修改函数逻辑,直接在原对象上做修改而非生成新对象:
def meantemp(df): # 计算平均温度,直接修改原df df['temp'] = df.iloc[:, 2:].mean(axis=1) # 在原对象上直接删除非目标列,修改会同步到所有引用该对象的变量 df.drop(columns=df.columns.difference(['Latitude','Longitude','temp']), inplace=True) return df # 执行处理,此时列表内元素和外部原始df变量都会同步更新 weather_list = [df.pipe(meantemp) for df in weather_list]
方案2:处理后单独赋值回外部变量
如果不想修改原对象,可在列表处理完成后将结果解包赋值给你需要单独使用的变量:
# 原有处理逻辑不变 def meantemp(df): df['temp'] = df.iloc[ : , 2:].mean(axis = 1) df = df[['Latitude','Longitude','temp']] return df weather_list = [df.pipe(meantemp) for df in weather_list] # 假设你原来的独立变量是df1、df2、df3,按顺序解包赋值即可 df1, df2, df3 = weather_list
内容的提问来源于stack exchange,提问作者Jesse
相关产品推荐
相关产品推荐

