首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Pandas数据分割成块从NaN到NaN?

如何将Pandas数据分割成块从NaN到NaN?
EN

Stack Overflow用户
提问于 2020-07-15 12:39:18
回答 2查看 473关注 0票数 2

假设我有以下数据:

代码语言:javascript
复制
import pandas as pd

csv = [
    ['2019-05-01 00:00', ],
    ['2019-05-01 01:00', 2],
    ['2019-05-01 02:00', 4],
    ['2019-05-01 03:00', ],
    ['2019-05-01 04:00', 2],
    ['2019-05-01 05:00', 4],
    ['2019-05-01 06:00', 6],
    ['2019-05-01 07:00', ],
    ['2019-05-01 08:00', ],
    ['2019-05-01 09:00', 2]]

df = pd.DataFrame(csv, columns=["DateTime", "Value"])

因此,我使用的是数据缺口的时间序列:

代码语言:javascript
复制
           DateTime  Value
0  2019-05-01 00:00    NaN
1  2019-05-01 01:00    2.0
2  2019-05-01 02:00    4.0
3  2019-05-01 03:00    NaN
4  2019-05-01 04:00    2.0
5  2019-05-01 05:00    4.0
6  2019-05-01 06:00    6.0
7  2019-05-01 07:00    NaN
8  2019-05-01 08:00    NaN
9  2019-05-01 09:00    2.0

现在,我想一个接一个地处理每一块现有的数据。我是说,我想把这个系列分割成小块。目标是迭代这些块,这样我就可以单独地将每个块传递给另一个函数,它不能处理数据中的空白。然后,我想将结果存储在相应位置的原始数据文件中。对于一个简单的例子,假设函数计算块的平均值。预期结果:

代码语言:javascript
复制
           DateTime  Value  ChunkAverage
0  2019-05-01 00:00    NaN           NaN
1  2019-05-01 01:00    2.0           3.0
2  2019-05-01 02:00    4.0           3.0
3  2019-05-01 03:00    NaN           NaN
4  2019-05-01 04:00    2.0           4.0
5  2019-05-01 05:00    4.0           4.0
6  2019-05-01 06:00    6.0           4.0
7  2019-05-01 07:00    NaN           NaN
8  2019-05-01 08:00    NaN           NaN
9  2019-05-01 09:00    2.0           2.0

我知道这可以通过迭代循环、"if“子句、用索引切片等”传统方式“实现,但我想在Pandas中有一些更高效、更安全的东西。但我不知道怎么做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-15 12:46:03

您可以使用df.groupby,使用pd.Series.isnapd.Series.cumsum

代码语言:javascript
复制
g = df.Value.isna().cumsum()
df.assign(chunk = df.Value.groupby(g).transform('mean').mask(df.Value.isna()))
# df['chunk'] = df.Value.groupby(g).transform('mean').mask(df.Value.isna()))
# df['chunk'] = df.Value.groupby(g).transform('mean').where(df.Value.notna())

           DateTime  Value  chunk
0  2019-05-01 00:00    NaN    NaN
1  2019-05-01 01:00    2.0    3.0
2  2019-05-01 02:00    4.0    3.0
3  2019-05-01 03:00    NaN    NaN
4  2019-05-01 04:00    2.0    4.0
5  2019-05-01 05:00    4.0    4.0
6  2019-05-01 06:00    6.0    4.0
7  2019-05-01 07:00    NaN    NaN
8  2019-05-01 08:00    NaN    NaN
9  2019-05-01 09:00    2.0    2.0

注意:

  • df.assign(...)给出了新的dataframe.
  • df['chunk'] = ...,使原始数据在原地的

发生变异。

票数 3
EN

Stack Overflow用户

发布于 2020-07-15 12:52:12

一种可能的方法是根据NaN中的Value添加一个分隔列,并按此进行分组:

代码语言:javascript
复制
df['separator']=df['Value'].isna().cumsum().fillna("")
df['Value'] = df['Value'].fillna("")
grp = df.groupby('separator').agg(avg = pd.NamedAgg(column='Value', aggfunc='sum'))

print(grp)

这将计算每个组中的值:

代码语言:javascript
复制
           avg
separator     
1            2
2            3
3            0
4            1

您希望如何填充NaN,这在一定程度上取决于您希望通过计算实现什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62915054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档