导出DataFrame筛选结果至Excel触发KeyError,求解决方法
问题分析与解决
报错根源
KeyError 是因为你导出Excel时指定的列名 ['Date','name', 'myname', 'fx'] 并不存在于DataFrame a 中。a 从 df2 筛选而来,而 df2 的列是 Date、name1、myname1、fx1,两者列名完全不匹配,自然找不到对应列。
另外你的筛选逻辑 df2[np.array(df)> np.array(df2)] 也有问题:df 和 df2 列名不一致,直接转数组比较会导致维度错位,最终得到的a里会有大量NaN值,不符合筛选有效数据的需求。
修正方案
步骤1:修正筛选逻辑
要实现“用df的pct_change结果对比df2对应列,筛选df2中符合条件的行”,需要先对齐对比列,生成正确的布尔掩码:
- 提取df中计算后的百分比变化列(
name、myname、fx) - 提取df2中对应对比列(
name1、myname1、fx1),并重命名和df列名一致,方便比较 - 生成布尔条件后,筛选df2的行
步骤2:修正导出列名
导出时使用df2实际存在的列名,或者根据需求重命名列后再导出。
修正后的代码
import pandas as pd import numpy as np # 文件路径 path = 'C:/Users/a1b.xlsx' # 读取数据 df = pd.read_excel(path, sheet_name='Sheet1', usecols=['Date','name', 'myname', 'fx']) df2 = pd.read_excel(path, sheet_name='Sheet1', usecols=['Date','name1', 'myname1', 'fx1']) # 计算百分比变化 df[['name','myname','fx']] = df[['name','myname','fx']].pct_change(periods=5) # 对齐df2的列名,方便和df对比 df2_compare = df2.rename(columns={'name1':'name', 'myname1':'myname', 'fx1':'fx'}) # 生成布尔掩码:df的百分比变化 > df2对应列的值 mask = df[['name','myname','fx']] > df2_compare[['name','myname','fx']] # 筛选df2中至少满足一个条件的行(用all()可要求全部满足,按需调整) a = df2[mask.any(axis=1)] # 导出时使用df2实际的列名 a.to_excel('C:/Users/a1b.xlsx', sheet_name='Sheet3', startcol=2, index=False, columns=['Date','name1', 'myname1', 'fx1'])
可选调整:导出指定列名
如果希望导出的列名是name、myname、fx,可以在筛选后给a重命名列再导出:
a_renamed = a.rename(columns={'name1':'name', 'myname1':'myname', 'fx1':'fx'}) a_renamed.to_excel('C:/Users/a1b.xlsx', sheet_name='Sheet3', startcol=2, index=False, columns=['Date','name', 'myname', 'fx'])
内容的提问来源于stack exchange,提问作者user20838010
相关产品推荐
相关产品推荐

