【发布时间】:2021-12-30 23:25:55
【问题描述】:
我相当确定我知道为什么在合并 2 个 DF 后我会在 DF2 中获得 nan 值,但我不明白如何解决这个问题。我的数据如下所示。 DF2 df 是一个非常大的 DF,其年、月和日可追溯到 1991 年。我正在尝试将此 DF2 的子集与 DF1 中更小的年/月/日子集匹配或合并。 = 2018。通常,“nan”值的这个问题是由于 df1、df2 中的列名不匹配或相似,但我的列在我看来是一样的。
DF1:
Out[2]:
plant_name obsvals year month day hour
0 COPPER CROSSING 0.0 2018 1 1 2
1 COPPER CROSSING 0.0 2018 1 1 3
2 COPPER CROSSING 0.0 2018 1 1 4
3 COPPER CROSSING 0.0 2018 1 1 5
4 COPPER CROSSING 0.0 2018 1 1 6
我的第二个 df 看起来像这样: DF2:
plant_name business_name maint_region_name modelvals dataset year month day hour
245448 COPPER CROSSING UNITED STATES CENTRAL 3839.9 ERA5 2018 1 1 0
245449 COPPER CROSSING UNITED STATES CENTRAL 0.0 ERA5 2018 1 1 1
245450 COPPER CROSSING UNITED STATES CENTRAL 0.0 ERA5 2018 1 1 2
245451 COPPER CROSSING UNITED STATES CENTRAL 0.0 ERA5 2018 1 1 3
245452 COPPER CROSSING UNITED STATES CENTRAL 0.0 ERA5 2018 1 1 4
我合并这两个 DF 的想法是这样,但它使用 how ="inner" 和 how = "left" 为 'modelvals' 列中的 DF2 提供了 'nan' 值。感谢您提出如何合并这 2 个 DF 的想法。
DF3 = DF1.merge(DF2, on=["plant_name", "year", "month", "day", "hour"], how="inner")
输出如下所示:
fdf = DF3[(DF3['year'] == 2018) & (DF3['month'] == 1) & (DF3['day']==1) ]
plant_name obsvals year month day hour business_name maint_region_name modelvals dataset
0 COPPER CROSSING 0.0 2018 1 1 2 UNITED STATES CENTRAL NaN ERA5
1 COPPER CROSSING 0.0 2018 1 1 3 UNITED STATES CENTRAL NaN ERA5
2 COPPER CROSSING 0.0 2018 1 1 4 UNITED STATES CENTRAL NaN ERA5
3 COPPER CROSSING 0.0 2018 1 1 5 UNITED STATES CENTRAL NaN ERA5
4 COPPER CROSSING 0.0 2018 1 1 6 UNITED STATES CENTRAL NaN ERA5
您可以在“modelvals”列中看到“nan”值。我在下面包含了两个熊猫的数据类型:
DF1:
plant_name object
obsvals float64
year int64
month int64
day int64
hour int64
dtype: object
DF2:
plant_name object
business_name object
maint_region_name object
modelvals float64
dataset object
year int64
month int64
day int64
hour int64
dtype: object
我正在合并 'plant_name','year','month','day','hour',它们看起来具有相同的数据类型。在代码的上一步中,我在上面显示的合并步骤之前从 DF1 df 中删除了“nan”值。
【问题讨论】:
-
我无法重现该错误。
modelvals的所有 3 行对我来说都是0.0 -
嗨 - 既然我已经发布了一些编辑,请您再看看吗?