我希望使用ID,工作日和小时匹配的其他数据框中的值更新mergeAllGB.Intensity
列NaN
值。我正在尝试:
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
答案 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()]
,SId
,Hour
)值的值,则分配给它可能会失败。