Pandas 如何根据条件将monthy数据转换为nan?
我有这个df:Pandas 如何根据条件将monthy数据转换为nan?,pandas,Pandas,我有这个df: CODE DATE TMAX TMIN PP 0 000130 1991-01-01 32.6 23.4 0.0 1 000130 1991-01-02 31.2 22.4 0.0 2 000130 1991-01-03 32.0 NaN 0.0 3 000130 1991-01-04 32.2 23.0 0.0 4 000130 1991-01-05 30.5
CODE DATE TMAX TMIN PP
0 000130 1991-01-01 32.6 23.4 0.0
1 000130 1991-01-02 31.2 22.4 0.0
2 000130 1991-01-03 32.0 NaN 0.0
3 000130 1991-01-04 32.2 23.0 0.0
4 000130 1991-01-05 30.5 22.0 0.0
... ... ... ... ...
10865 000130 2020-12-31 NaN NaN NaN
10866 000132 1991-01-01 35.2 NaN 0.0
10867 000132 1991-01-02 34.6 NaN 0.0
10868 000132 1991-01-03 35.8 NaN 0.0
10869 000132 1991-01-04 34.8 NaN 0.0
仅当一个月内有5个或更多连续的NaN值时,我才希望将月度数据转换为NaN
例如:如果1991年1月TMAX列中有5个或更多连续的NaN值,则TMAX列的所有1991年1月值必须转换为NaN。每年每个月都一样。我需要按代码执行此操作(每个代码值都有1991年1月、1991年2月、2020年12月的TMAX数据)。所以我首先考虑使用df.groupby['code']
。共有371个代码
对于PP列,仅当一个月内有3个或更多非连续NaN值时,我需要将月度数据转换为NaN。例如:如果1991年1月PP列中有3个非连续的NaN值,则TMAX列的所有1991年1月值必须转换为NaN。每年每个月都一样。我还需要通过代码来实现这一点
我是python的乞丐,所以我会感谢任何帮助
提前感谢。- 生成测试数据集的合理代码量
- 定义要在
transform()中调用的函数
groupby()
- n是一个参数,因此可用于不同的连续运行
# contruct a CODE / DATE dataframe
df = (pd.DataFrame([f"{i:08d}" for i in range(3)], columns=["CODE"]).assign(foo=1)
.merge(pd.DataFrame(pd.date_range("01-Jan-1991", "01-Jan-1993"), columns=["DATE"]).assign(foo=1), on="foo")
.drop(columns="foo")
)
# add a column that has NaNs in it, some will consequetive...
A = np.random.uniform(20,30, len(df))
A.ravel()[np.random.choice(A.size, A.size//3, replace=False)] = np.nan
df["TMIN"] = A
# function that will return NaN if more than n consecutive NaNs
def consecutivenan(d, n=5):
if d.isnull().astype(int).groupby(d.notnull().astype(int).cumsum()).sum().ge(n).any():
return np.nan
else:
return d
df["TMIN_C"] = df.groupby(["CODE", df.DATE.dt.year, df.DATE.dt.month], as_index=False)["TMIN"].transform(consecutivenan, n=5)
# demo it's worked
i = df.loc[~df.TMIN.isna() & df.TMIN.ne(df.TMIN_C)].index[0]
df.loc[i-2:i+28]