我有一个每日值为几个月的数据,如下所示:
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,第三个月也会用第二个月的值填充。所以我希望是这样:
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数据。我有麻烦,因为每个月都有不同的终日,所以我不知道如何为它设定正确的条件。日期采用日期时间格式。
发布于 2022-01-04 18:27:25
备选案文1:
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:
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
这是一个棘手的解决方案,也许其他人会有一个更好的解决方案。
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'])https://stackoverflow.com/questions/70583116
复制相似问题