Python Pandas 滚动日期窗口内最常见的值

5

我有一个包含以下数据的pandas数据帧,我想添加一个新列,在每个日期上返回前三天内出现最频繁的“weather_type”。如果结果相同,则应返回最近的“ weather_type”。

d = {'date': ['17/02/2017', '18/02/2017', '19/02/2017', '20/02/2017', 
'21/02/2017', '22/02/2017'], 'precipmm': [1, 0, 3, 2, 7, 8], 'weather_type':
['rain', 'sun', 'rain', 'snow', 'snow', 'rain']}
df = pd.DataFrame(data=d)
df['date']=pd.to_datetime(df['date'], format='%d/%m/%Y')
df['rollingsum_precipmm']=df['precipmm'].rolling(window=3).sum()

我已经成功创建了一个新列,其中包含过去3天内“precipmm”的总和,使用以下代码:

df['rollingsum_precipmm']=df['precipmm'].rolling(window=3).sum()

我认为答案围绕着这个问题,但是我还没有找到解决办法。
一如既往地感谢您的帮助。
Colin

1
请在代码中添加示例数据框df。 - ivan7707
如果结果是平局,我希望返回最近的“weather_type”。这个要返回到另一列吗? - TYZ
no the same column please - Colin Blyth
1
@ColinBlyth 在同一列中使用不同的数据类型并不太合理,这通常会使进一步的分析和处理变得困难。您想将它们放在同一列中的原因是什么? - TYZ
2个回答

9
要启用滚动模式,您可以执行以下操作:
from scipy.stats import mode
df['precipmm'].rolling(window=7).apply(lambda x: mode(x)[0])

1
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.mode.html - Stop harming Monica
我尝试过 df['most_common']=df['weather_type'].rolling(window=3).apply(lambda x: mode(x)[0]) 但它似乎不起作用。这个新列的最后一行的值是'rain',但应该是'snow'。 - Colin Blyth
@ColinBlyth 这段代码只产生了滚动模式,我还没有想出第二部分,关于你在关于“为什么”想要这样做的问题中,我已经回复了你。 - TYZ
抱歉,我误解了问题,我希望这个结果出现在新列中。 - Colin Blyth
@Goyo 这不适用于滚动对象,只适用于系列。 - TYZ
@YilunZhang 我原以为使用它来消除对scipy.stats的依赖会很容易,但仔细一看发现并不那么简单。 - Stop harming Monica

1
为了使结果出现在新列中:
df=df.assign(new_column=df['precipmm'].rolling(window=7).apply(lambda x: mode(x)[0]))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接