Python / Pandas - 基于多个条件的新列

时间:2017-03-15 12:37:35

标签: python pandas

我想创建一个新列,它必须在多个地方遵守多个条件。我有三个数据帧: - 我想将该列添加到: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.Precipitation0,但是weatherdata。但是,并非所有缺失的数据都意味着没有降水,也可能意味着技术故障。这就是dataavail的用武之地。如果Timestamp中的data AvailabilityFalse,则表示存在技术问题并且没有数据。如果Timestamp中的data AvailabilityTrue,则表示降水实际为0.

现在,我想将此信息合并到data字段中。所以: 如果Timestamp/ID中存在来自data的{​​{1}}对,则只需从中提取信息即可。 如果来自weatherdata的{​​{1}}对Timestamp/ID中不存在,则应检查data数据帧,如果weatherdatadataavailAvailability应为True,否则应为Precipitation,以便我以后可以将其归咎于此。

因此,对于上面的示例,所需的输出将是

0

在这样的设置中使用什么语法,必须根据子条件满足多个条件?谢谢!

更新

试过jezrael的解决方案。我有以下数据帧:

enter image description here

enter image description here

然后我对它们NA/NaN。结果:

enter image description here

我已经以编程方式进行了检查,ID Timestamp Precipitation 25 201605252300 1 29 201605252315 NaN 94 201605252015 0 中的所有数据都是mergedAll = pd.merge(imp_df, precip, on=['SId','Time'], how='left')Intensity匹配: enter image description here

更新2

将数据排序后,˙mask˙部分仍然不起作用: enter image description here

即使NaN位于可用性数据框中,强度也会转换为dtypes而不是0。

1 个答案:

答案 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