Pandas/Python - 根据值匹配更新数据框

3
我想更新mergeAllGB.Intensity列中的NaN值,将其替换为另一个数据框中匹配ID、星期和小时的值。我尝试了以下代码:
mergeAllGB.Intensity[mergeAllGB.Intensity.isnull()] = precip_hourly[precip_hourly.SId == mergeAllGB.SId & precip_hourly.Hour == mergeAllGB.Hour & precip_hourly.Weekday == mergeAllGB.Weekday].Intensity

然而,这会返回“ValueError:Series长度必须匹配才能进行比较”。我该怎么做?
最简示例:
Inputs:
_______
mergeAllGB
SId  Hour Weekday Intensity
1    12   5       NaN
2    5    6       3

precip_hourly
SId  Hour Weekday Intensity
1    12   5       2

Desired output:
________
mergeAllGB
SId  Hour Weekday Intensity
1    12   5       2
2    5    6       3

我正在尝试使用set_value使其正常工作。但是,由于长度不匹配,我认为我会收到相同的错误/不正确的结果。但也许有人会看到它并激发灵感:df = mergeALLGB.set_value(mergeAllGB['Intensity'].isnull(), 'Intensity', precip_hourly['Intensity']) - MattR
1个回答

0

简而言之,这将(希望)有效:

# Set the index to compare by
df = mergeAllGB.set_index(["SId", "Hour", "Weekday"])
fill_df = precip_hourly.set_index(["SId", "Hour", "Weekday"])

# Fill the nulls with the relevant values of intensity
df["Intensity"] = df.Intensity.fillna(fill_df.Intensity)
# Cancel the special indexes
mergeAllGB = df.reset_index()

或者,倒数第二行可以是

df.loc[df.Intensity.isnull(), "Intensity"] = fill_df.Intensity

pandas中的赋值和比较是通过索引来完成的(这在您的示例中没有显示)。

在示例中,运行precip_hourly.SId == mergeAllGB.SId会导致ValueError: Can only compare identically-labeled Series objects。这是因为我们尝试按值比较两列,但是precip_hourly没有一个以索引1(默认索引从0开始)的行,因此比较失败。

即使我们假设比较成功,赋值阶段也存在问题。Pandas尝试根据索引进行分配-但这并不具有预期的含义。

幸运的是,我们可以利用它来实现自己的目的-通过将索引设置为["SId", "Hour", "Weekday"],任何比较和赋值都将与该索引相关联,因此运行df.Intensity= fill_df.Intensity将在匹配索引的位置上将fill_df.Intensity中的值分配给df.Intensity,也就是说,在它们具有相同的["SId", "Hour", "Weekday"]时。

为了仅对 IntensityNA 的位置进行赋值,我们需要先进行过滤(或使用 fillna)。请注意,通过 df.Intensity[df.Intensity.isnull()] 进行过滤是可行的,但如果您有多个具有相同 (SIdHourWeekday) 值的数值,则对其进行赋值可能会失败。

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