我想创建一个新列,它必须在多个地方遵守多个条件。我有三个数据帧:
- 我想将该列添加到:data
ID Timestamp
25 201605252300 #Y/M/D/H/M
29 201605252315
94 201605252015
- 包含有关数据可用性信息的文件:dataavail
Timestamp Availability
201605252300 True
201605252315 False
201605252015 True
- 包含实际数据weatherdata
ID Timestamp Precipitation
25 201605252300 1
问题是,如果没有下雨,那么{em>不标记为weatherdata.Precipitation
为0
,但是weatherdata
。但是,并非所有缺失的数据都意味着没有降水,也可能意味着技术故障。这就是dataavail
的用武之地。如果Timestamp
中的data
Availability
为False
,则表示存在技术问题并且没有数据。如果Timestamp
中的data
Availability
为True
,则表示降水实际为0.
现在,我想将此信息合并到data
字段中。所以:
如果Timestamp/ID
中存在来自data
的{{1}}对,则只需从中提取信息即可。
如果来自weatherdata
的{{1}}对Timestamp/ID
中不存在,则应检查data
数据帧,如果weatherdata
为dataavail
, Availability
应为True
,否则应为Precipitation
,以便我以后可以将其归咎于此。
因此,对于上面的示例,所需的输出将是
0
在这样的设置中使用什么语法,必须根据子条件满足多个条件?谢谢!
更新
试过jezrael的解决方案。我有以下数据帧:
然后我对它们NA/NaN
。结果:
我已经以编程方式进行了检查,ID Timestamp Precipitation
25 201605252300 1
29 201605252315 NaN
94 201605252015 0
中的所有数据都是mergedAll = pd.merge(imp_df, precip, on=['SId','Time'], how='left')
。 Intensity
匹配:
更新2
即使NaN
位于可用性数据框中,强度也会转换为dtypes
而不是0。
答案 0 :(得分:1)
我认为你需要:
#add weatherdata data if exist
df = pd.merge(data, weatherdata, on=['ID','Timestamp'], how='left')
#get Timestamp values where True in column Availability
vals = dataavail.loc[dataavail.Availability, 'Timestamp']
print (vals)
0 201605252300
2 201605252015
Name: Timestamp, dtype: int64
#True if exist Timistamps in vals and if not exist in df (NaN)
mask = df.Timestamp.isin(vals) & df.Precipitation.isnull()
#convert True to 0
df.Precipitation = df.Precipitation.mask(mask, 0)
print (df)
ID Timestamp Precipitation
0 25 201605252300 1.0
1 29 201605252315 NaN
2 94 201605252015 0.0