【问题标题】:Using Lambda function and to continue despite Key Error使用 Lambda 函数并在出现键错误的情况下继续
【发布时间】:2021-10-13 06:38:28
【问题描述】:

尽管抛出了 KeyError,但我希望继续使用 for 循环或 lambda 函数

df_dates = ['7/1/2021', '8/1/2021', '8/2/2021']

df_values

    8/1/2021       1
    8/2/2021       2
df_test = df_dates.apply(lambda x: df_values.loc[x])

本质上,日期列表中的'7/1/2021' 日期在df_valuesloc 函数中引发了关键错误

【问题讨论】:

  • 函数本身应该捕获并处理错误,这就排除了使用 lambda 表达式作为 df_dates.apply 的参数。

标签: python pandas dataframe lambda conditional-statements


【解决方案1】:

正如 chepner 建议的那样,您必须在 lambda 函数中捕获并处理错误。 我想您的数据在这样的数据框中:

df_values = pd.DataFrame({'dates': ['8/1/2021', '8/2/2021'], 'values': [1, 2]}).set_index('dates')
          values
dates           
8/1/2021       1
8/2/2021       2

而你将要处理的数据存储在pandas.Series

df_dates = pd.Series(['7/1/2021', '8/1/2021', '8/2/2021'])

根据这些假设,解决方案可能是:

df_test = df_dates.apply(lambda x: df_values.loc[x].values[0] if x in df_values.index else 'no value')

所以你会得到pandas.Series:

0    no value
1           1
2           2
dtype: object

或者,如果您想要list 形式的结果:

df_test = df_dates.apply(lambda x: df_values.loc[x].values[0] if x in df_values.index else 'no value').to_list()
['no value', 1, 2]

您应该根据您存储数据的方式以及您希望获得的结果来定制.loc.apply 方法。用于捕获和处理错误的lambda 调用的一般结构是:

pandas.Series.apply(lambda input: output_1 if condition is True else output_2)

【讨论】:

  • 所以我尝试了这个示例,但是当我这样做时,它不会作为数据帧返回,并且几乎会在列表中返回单个数据帧,而如果我执行 df_dates.iloc[1:] 它可以工作。
  • 我已经更新了我的答案,希望对你有帮助:-)
  • 想通了!由于某种原因 loc 正在返回整个系列......我们需要 line item()
猜你喜欢
  • 2023-01-07
  • 2014-05-03
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
相关资源
最近更新 更多