【问题标题】:Python function returns "list of lists" instead of flat listPython 函数返回“列表列表”而不是平面列表
【发布时间】:2020-06-26 13:06:39
【问题描述】:

我的目标是将 pandas 数据帧、下限值和上限值传递给函数,使用最近邻对边界内的所有 NaN 进行插值,返回插值后的 df 和进行的插值次数。有时一行中有几个 NaN,因此嵌套循环查找下一个非 NaN 值进行插值。

def gap_clean(df, lb, ub):
    data = {'a':df.index, 'b':df.values}     
    df2 = pd.DataFrame(data)
    lb_index = df[df['a'] == lb].index.values[0]
    ub_index = df[df['a'] == ub].index.values[0]
    interpolations = 0
    for i in range(lb_index, ub_index+1):
        if np.isnan(df2.loc[i, 'b']):
            for j in range(1, 20):
                if ~np.isnan(df2.loc[i+j, 'b']):
                    interpolations += 1
                    df2.loc[i, 'b'] = (df2.loc[i - 1, 'b'] + df2.loc[i + j, 'b']) / 2
                    break
    df2 = df2.set_index(['a'])
return df2, interpolations;

返回的 df 的预期行为是我可以调用并获取

In []: df.values
Out[]: [1.23,
         2.44,
         3.55, 
          ...]

相反,我得到:

In []: df.values
Out[]: array([[1.23],
              [2.44],
              [3.55],
                ...])

如果我打电话,我可以解决这个问题并获得预期的结果:

reduce(operator.add, df.values.tolist())

将其压平,但每次都这样做很痛苦。如何修改函数以提供预期的行为?

【问题讨论】:

  • 你可以试试df['col'].values
  • 这是最简单的解决方案,谢谢。

标签: python pandas dataframe


【解决方案1】:

如果您希望您的函数返回 DataFrame,那么您无能为力。这就是 Pandas DataFrame.values 函数的工作原理。
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.values.html

>>> pd.DataFrame([1,2,3]).values
array([[1],
       [2],
       [3]])

您可能只想简单地将函数中的数据以所需格式:

return [e[0] for e in df.values], interpolations

注意:这种转换方法称为列表推导。看起来比你的reduce(operator.add ...)简单

【讨论】:

  • 我也需要索引。这不会只返回值吗?
  • 是的,这个选项只返回值。如果你需要一个数据框,那么我不明白你想在你的函数中改变什么。它已经返回一个数据框。如果您查看如何将 df 转换为值列表,则会给出示例
【解决方案2】:

您可以使用 pandas API 支持进行插值,并且不需要 nan 检查等。用于插值的 limit_area 选项进一步支持上限和下限。

Check the interpolation API

【讨论】:

  • 谢谢,这很有帮助,我没有注意到插值 API 有 limit_area 和连续的 NaN 条件。
猜你喜欢
  • 1970-01-01
  • 2014-03-17
  • 2023-04-08
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 2020-01-31
相关资源
最近更新 更多