首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何转发填充直到某个点,并将剩下的作为NANS放在python中?

我如何转发填充直到某个点,并将剩下的作为NANS放在python中?
EN

Stack Overflow用户
提问于 2022-01-04 17:56:53
回答 1查看 270关注 0票数 0

我有一个每日值为几个月的数据,如下所示:

代码语言:javascript
运行
复制
London 2000-01-01  5
London 2000-01-02  nan
London 2000-01-03  nan
..
London 2000-01-31  nan
London 2000-02-01  3
London 2000-02-02  nan
London 2000-02-01  nan
...
London 2000-02-31  nan
London 2000-03-01  nan
London 2000-01-01  nan
..

所以对于前两个月,有一个值在第一个月,我想把第一个月的值转发给整个月份的值,但是如果我只是用方法= ffill填充be,第三个月也会用第二个月的值填充。所以我希望是这样:

代码语言:javascript
运行
复制
London 2000-01-01  5
London 2000-01-02  5
London 2000-01-03  5
..
London 2000-01-31  5
London 2000-02-01  3
London 2000-02-02  3
London 2000-02-01  3
...
London 2000-02-31  3
London 2000-03-01  nan
London 2000-01-01  nan
..

是否有办法只在下一个月进行补足?我的开始日期和结束日期将是可变的,因此,例如,我可能有2000-01年的第一个月数据,直到2000-10年,但我的总体数据可能在2000-01年到2000-12年之间,所以我只想要两个月的NANS数据。我有麻烦,因为每个月都有不同的终日,所以我不知道如何为它设定正确的条件。日期采用日期时间格式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-04 18:27:25

备选案文1:

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

df = pd.DataFrame(index=pd.date_range('2000-01-01', '2005-01-01', freq='D'))
values_to_set = [{'value':3, 'from':'2000-01', 'to':'2000-05'}, 
                 {'value':5, 'from':'2000-06', 'to':'2000-09'}
                ]

for v in values_to_set:
    df.loc[v['from']:v['to'], 'value'] = v['value']
    
df.loc['2000-09-28':'2000-10-02']

备选案文2:

代码语言:javascript
运行
复制
import pandas as pd
import numpy as np

df = pd.DataFrame(index=pd.date_range('2000-01-01', '2005-01-01', freq='D'))

df.loc['2000-02-01', 'value'] = 5
df.loc['2000-05-01', 'value'] = 6

df.loc['2000-10-01', 'value'] = -1  # set stop value

df.ffill(inplace=True)
df.replace(-1, np.nan, inplace=True)

df.loc['2000-09-28':'2000-10-02']

选项3

这是一个棘手的解决方案,也许其他人会有一个更好的解决方案。

代码语言:javascript
运行
复制
import pandas as pd
import numpy as np

df = pd.DataFrame(index=pd.date_range('2000-01-01', '2005-01-01', freq='D'))

df.loc['2000-02-01', 'value'] = 5
df.loc['2000-05-01', 'value'] = 6

_mask_1 = ~df['value'].isna()  # filters non empty values
_mask_2 = (df.index.day==1)  # filters 1st of each month

df.loc[_mask_1,'tmp'] = -1  # marks non empty values on a temporal column

df.loc[_mask_1|_mask_2, 'tmp'] =   df['tmp'][_mask_1|_mask_2].shift(1) # moves temp values one month ahead

_mask_3 = df['tmp'] == -1  # filters next month non empty
df.loc[_mask_3, 'value'] = -1   # set stop value on 'value' column
df.drop(columns='tmp', inplace=True)  # drops temporal column

# shows the stop mark for march
print(df['2000-02-28':'2000-03-02'])

# perform the forward filling

df.ffill(inplace=True)
df.replace(-1, np.nan, inplace=True)

print(df.loc['2000-02-28':'2000-03-02'])

print(df.loc['2000-05-28':'2000-06-02'])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70583116

复制
相关文章

相似问题

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