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

时间:2017-03-15 15:06:03

标签: python pandas

我希望使用ID,工作日和小时匹配的其他数据框中的值更新mergeAllGB.IntensityNaN值。我正在尝试:

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 lengths must match to compare。我怎么能这样做?

最小例子:

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

1 个答案:

答案 0 :(得分:0)

TL; DR这将(希望)有效:

# 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开始),因此比较失败。

即使我们假设比较成功,分配阶段也是有问题的。 熊猫试图根据指数进行分配 - 但这没有预期的含义。

幸运的是,我们可以将它用于我们自己的利益 - 通过将索引设置为["SId", "Hour", "Weekday"],任何比较和分配都将与此索引相关,因此运行df.Intensity= fill_df.Intensity将分配给{ {1}} df.Intensity中的值与索引匹配的位置,即只要它们具有相同的fill_df.Intensity

要仅指定["SId", "Hour", "Weekday"]Intensity的地方,我们需要先过滤(或使用NA)。请注意,按fillna过滤将有效,但如果您有多个具有相同(df.Intensity[df.Intensity.isnull()]SIdHour)值的值,则分配给它可能会失败。