我有一份联合数据,其中载有1979年至2020年期间来自两个来源的每日降水量:
precip_1 precip
time
1973-01-04 0.0 NaN
1973-01-07 0.0 NaN
1973-01-08 0.0 NaN
1973-01-12 0.0 NaN
1973-01-17 0.0 NaN
... ...
2020-12-27 NaN 0.434374
2020-12-28 NaN 0.923621
2020-12-29 NaN 0.012130
2020-12-30 NaN 0.064116
2020-12-31 NaN 2.041316
[16978 rows x 2 columns]我要做的是将6-8个月中的任何零值设置为NaN,但将任何零值保留在这些月份之外。据我所知,我可以使用以下功能来完成此操作:
df1 = df.replace(0, nan)但是,我似乎不明白的是,如何在dataframe中只选择特定的月份。有什么想法吗?
非常感谢
发布于 2022-07-04 17:14:41
您可以尝试将时间列转换为DateTime对象,以便轻松地比较月份。完成此操作后,您可以使用apply函数和lambda函数比较日期,并按照您的描述更改它们。希望这能有所帮助!
import pandas as pd
import datetime
data = {'time':['2020-01-18','2020-02-29','2020-6-28','2020-7-27'],'precip_1':[0.434374,0.923621,0,0]}
df = pd.DataFrame(data)
df['time'] = df['time'].apply(lambda x: datetime.datetime.strptime(x, '%Y-%m-%d'))
df['precip_1'] = df.apply(lambda row: 'nan' if (row.time.month > 5 and row.time.month < 8) and row.precip_1 == 0 else row.precip_1,axis=1)发布于 2022-07-04 17:56:53
“替换”工作得很好,但是它不能很好地处理来自其他列的逻辑,因此对于.loc accessor来说,这实际上是一个更好的情况。
df = pd.DataFrame(
[
['2020-06-05', 1], # > 0 value, don't change
['2020-06-05', 0], # 0 value, change to nan
['2020-12-05', 1],
['2020-12-05', 0], # wrong month, don't change
],
columns=['date', 'precip']
)
df.date = pd.to_datetime(df.date)
df.loc[(df['date'].dt.month.between(6, 8)) & (df['precip'] == 0), 'precip'] = np.nan输出:
date precip
0 2020-06-05 1.0
1 2020-06-05 NaN
2 2020-12-05 1.0
3 2020-12-05 0.0https://stackoverflow.com/questions/72859459
复制相似问题