在最短日期记录上合并两个 DF 并删除不匹配的日期行
Merging two DF's on shortest date record and delete non-matching date rows
我有两个df,我需要根据df的日月年合并成一个新的df,日月年记录最短。换句话说,如果“日”、“月”和“年”列在比较中不匹配,那么我需要删除这些行或不匹配。具有最长记录或日、月、年行的 df 是“ncm”df,如下所示:
ncm.head()
Out[358]:
plant_name month year power_kwh
0 ALBUREJOS 1 2018 2634.583602
1 ALBUREJOS 1 2019 1947.384812
2 ALBUREJOS 1 2020 1787.296640
3 ALBUREJOS 2 2018 1539.008929
4 ALBUREJOS 2 2019 4948.003274
并且,我需要合并一些缺失数据和较短日期数(日、月和年)的第二个 df 是 df“dfm”,如下所示:
dfm.head()
Out[359]:
plant_name month year power_obs_kwh
0 ALBUREJOS 1 2018 2631.353970
1 ALBUREJOS 1 2019 1931.685916
2 ALBUREJOS 1 2020 1750.192298
3 ALBUREJOS 1 2021 314.000000
4 ALBUREJOS 2 2018 1537.588323
我已经尝试了多次类似下面这样的事情的迭代,并且遇到了这里也显示的这个错误。
new_df = dfm.merge(ncm, left_on=['month','year'], right_on = ['power_kwh'], how='left')
错误信息:
ValueError: len(right_on) must equal len(left_on)
感谢您的见解。
在merge
中,参数left_on
和right_on
必须是你想用来连接两个DataFrame的列,所以它们必须相同。在您的情况下,由于列具有相同的名称,您可以使用 on
代替
dfm.merge(ncm, on=['month','year'])
例如
np.random.seed(42)
df_1 = pd.DataFrame({
'month': np.random.choice(np.arange(1, 13), 100),
'year': np.random.choice(np.arange(2010, 2019), 100),
'some_data_1': np.random.random(100)
})
np.random.seed(33)
df_2 = pd.DataFrame({
'month': np.random.choice(np.arange(1, 13), 100),
'year': np.random.choice(np.arange(2010, 2019), 100),
'some_data_2': np.random.random(100)
})
然后我们就做
df_1.merge(
df_2,
on=['month', 'year']
)
这给出了
month year some_data_1 some_data_2
0 7 2018 0.242055 0.646164
1 7 2018 0.649633 0.646164
2 4 2016 0.672136 0.936810
3 11 2018 0.761620 0.419030
4 11 2018 0.761620 0.533564
.. ... ... ... ...
101 9 2010 0.853009 0.856196
102 9 2010 0.853009 0.602498
103 9 2010 0.853009 0.713095
104 5 2015 0.428184 0.377500
105 12 2010 0.294449 0.455945
[106 rows x 4 columns]
我有两个df,我需要根据df的日月年合并成一个新的df,日月年记录最短。换句话说,如果“日”、“月”和“年”列在比较中不匹配,那么我需要删除这些行或不匹配。具有最长记录或日、月、年行的 df 是“ncm”df,如下所示:
ncm.head()
Out[358]:
plant_name month year power_kwh
0 ALBUREJOS 1 2018 2634.583602
1 ALBUREJOS 1 2019 1947.384812
2 ALBUREJOS 1 2020 1787.296640
3 ALBUREJOS 2 2018 1539.008929
4 ALBUREJOS 2 2019 4948.003274
并且,我需要合并一些缺失数据和较短日期数(日、月和年)的第二个 df 是 df“dfm”,如下所示:
dfm.head()
Out[359]:
plant_name month year power_obs_kwh
0 ALBUREJOS 1 2018 2631.353970
1 ALBUREJOS 1 2019 1931.685916
2 ALBUREJOS 1 2020 1750.192298
3 ALBUREJOS 1 2021 314.000000
4 ALBUREJOS 2 2018 1537.588323
我已经尝试了多次类似下面这样的事情的迭代,并且遇到了这里也显示的这个错误。
new_df = dfm.merge(ncm, left_on=['month','year'], right_on = ['power_kwh'], how='left')
错误信息:
ValueError: len(right_on) must equal len(left_on)
感谢您的见解。
在merge
中,参数left_on
和right_on
必须是你想用来连接两个DataFrame的列,所以它们必须相同。在您的情况下,由于列具有相同的名称,您可以使用 on
代替
dfm.merge(ncm, on=['month','year'])
例如
np.random.seed(42)
df_1 = pd.DataFrame({
'month': np.random.choice(np.arange(1, 13), 100),
'year': np.random.choice(np.arange(2010, 2019), 100),
'some_data_1': np.random.random(100)
})
np.random.seed(33)
df_2 = pd.DataFrame({
'month': np.random.choice(np.arange(1, 13), 100),
'year': np.random.choice(np.arange(2010, 2019), 100),
'some_data_2': np.random.random(100)
})
然后我们就做
df_1.merge(
df_2,
on=['month', 'year']
)
这给出了
month year some_data_1 some_data_2
0 7 2018 0.242055 0.646164
1 7 2018 0.649633 0.646164
2 4 2016 0.672136 0.936810
3 11 2018 0.761620 0.419030
4 11 2018 0.761620 0.533564
.. ... ... ... ...
101 9 2010 0.853009 0.856196
102 9 2010 0.853009 0.602498
103 9 2010 0.853009 0.713095
104 5 2015 0.428184 0.377500
105 12 2010 0.294449 0.455945
[106 rows x 4 columns]