假设我有以下数据:
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"])因此,我使用的是数据缺口的时间序列:
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现在,我想一个接一个地处理每一块现有的数据。我是说,我想把这个系列分割成小块。目标是迭代这些块,这样我就可以单独地将每个块传递给另一个函数,它不能处理数据中的空白。然后,我想将结果存储在相应位置的原始数据文件中。对于一个简单的例子,假设函数计算块的平均值。预期结果:
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中有一些更高效、更安全的东西。但我不知道怎么做。
发布于 2020-07-15 12:46:03
您可以使用df.groupby,使用pd.Series.isna和pd.Series.cumsum
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'] = ...,使原始数据在原地的发生变异。
发布于 2020-07-15 12:52:12
一种可能的方法是根据NaN中的Value添加一个分隔列,并按此进行分组:
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)这将计算每个组中的值:
avg
separator
1 2
2 3
3 0
4 1您希望如何填充NaN,这在一定程度上取决于您希望通过计算实现什么。
https://stackoverflow.com/questions/62915054
复制相似问题