【问题标题】:Select rows from DataFrame based on condition根据条件从 DataFrame 中选择行
【发布时间】:2019-05-15 10:11:52
【问题描述】:

我有一个包含多列的 DataFrame,每列包含不同索引位置的 NaN 值。索引是 5 分钟频率的日期时间。

取第一列:选择直到第一个 NaN 行之前的行,或者如果相邻的 NaN 值彼此跟随,则选择直到第一个 NaN 范围。

我想从值序列中预测 NaN 值或 NaN 值。

下一次迭代:选择行(从头开始)直到下一个 NaN 值或 NaN 相邻范围,并选择 NaN 值/范围。预测 NaN 值/范围。

一直持续到该列不包含 NaN。

import pandas as pd
import numpy as np

column = ['values']
data = [1,2,3,4, np.nan, 6, 7, 8, np.nan, np.nan, np.nan, 12, 13, 14, np.nan, np.nan, 17, 18]
DateList_ = pd.date_range(start='2018-10-29 10:00:00', end='2018-10-29 11:25:00 ', freq='5T')

df_ = pd.DataFrame(data=data, columns=column, index=DateList_)

第一次迭代:values = [1,2,3,4], nan_periods=1 -> 根据值预测 [5]

第二次迭代:values = [1,2,3,4,5,6,7,8] nan_periods=3 -> 根据值预测 [9,10,11]

第三次迭代:值 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14] -> 根据值预测 [15,16]

迭代停止,不再有 NaN 值。

预测是通过 Prophet 完成的。我想在选择部分寻求一些帮助,以迭代选择包含值的行,以及以下 nan/s。

很遗憾,我不能使用插值!我拥有的真实序列要复杂得多,而不是像这个虚拟示例那样是线性的!本示例仅用于演示选择!

【问题讨论】:

  • Please address the solution I asked... 你问的实际上是线性插值。如果您想要其他插值方法或应用程序,则必须更具体...
  • 我编辑了帖子以表明不能使用插值。
  • 男人!序列不是线性的!这只是一个虚拟的例子,真正的问题是如何选择值,以及迭代的nan范围!
  • 如果要查找 NaN 或后续 NaN 的位置,可以使用 df_['values'].isna().astype(int).diff().gt(0) 之类的内容。您必须执行相同操作才能获取这些后续值结束的索引。你肯定会在 SO 中找到类似的东西
  • 你做的和 df_['values'].isnull() 一样...

标签: python pandas


【解决方案1】:

想法是在Seriesg 中创建具有连续NaNs 的组,然后循环groupby 并获取用于预测的变量,因为必须按位置选择使用Index.get_loc 按组的第一个值进行位置对于列名中的位置,然后通过loc 设置值以替换NaNs:

s = df_['values'].isna()
g = s.ne(s.shift()).cumsum()[s]
for i, x in df_.groupby(g):
    nan_periods = len(x)
    values = df_.iloc[:df_.index.get_loc(x.index[0]), df_.columns.get_loc('values')]
    print (nan_periods)
    print (values)
    #sample data
    Forecast = 10
    df_.loc[x.index, 'values'] = Forecast


print (df_)
                     values
2018-10-29 10:00:00     1.0
2018-10-29 10:05:00     2.0
2018-10-29 10:10:00     3.0
2018-10-29 10:15:00     4.0
2018-10-29 10:20:00    10.0
2018-10-29 10:25:00     6.0
2018-10-29 10:30:00     7.0
2018-10-29 10:35:00     8.0
2018-10-29 10:40:00    10.0
2018-10-29 10:45:00    10.0
2018-10-29 10:50:00    10.0
2018-10-29 10:55:00    12.0
2018-10-29 11:00:00    13.0
2018-10-29 11:05:00    14.0
2018-10-29 11:10:00    10.0
2018-10-29 11:15:00    10.0
2018-10-29 11:20:00    17.0
2018-10-29 11:25:00    18.0

【讨论】:

  • 非常感谢!现在尝试理解您的代码:D
  • @hk_03 - 好的,如果有什么需要解释的,请告诉我。
  • 可以用 tqdm 包装吗?
  • 据我了解,几乎所有带 for 的东西都可以用 tqdm 包裹起来。
  • 我猜:for i, x in tqdm.tqdm(df_.groupby(g)):。如果有效,则有效,否则无效:-)
猜你喜欢
  • 2017-09-23
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2022-11-25
  • 2018-03-02
  • 2020-01-14
相关资源
最近更新 更多