gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 19:09:06 26 4
gpt4 key购买 nike

我想更新 mergeAllGB.IntensityNaN 值,其中 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 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

最佳答案

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

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

幸运的是,我们可以为自己的利益使用它 - 通过将索引设置为 ["SId", "Hour", "Weekday"],任何比较和赋值都将通过关系完成到此索引,因此运行 df.Intensity= fill_df.Intensity 将分配给 df.Intensity fill_df.Intensity 中与索引匹配的值,也就是说,只要它们具有相同的 ["SId", "Hour", "Weekday"]

为了只分配给IntensityNA的地方,我们需要先过滤(或使用fillna)。请注意,按 df.Intensity[df.Intensity.isnull()] 过滤会起作用,但如果您有多个具有相同 (SId 的值,则对其赋值可能会失败, Hour, Weekday) 值。

关于python - Pandas/Python - 根据值匹配更新数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42813574/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com