如何合并 Pandas 中的两个不同大小的 DataFrame 以更新一个 DataFrame 取决于将一列中的部分值与另一个 DataFrame 匹配
How to merge two different size DataFrames in Pandas to update one dataframe depends on matching partial values in one column with another dataframe
我正在尝试编写工作任务代码,因此我制作了一个模拟此任务的简单案例。我有两个数据框:data_1
和 data_2
,我想用 data_2
中的行替换 data_1
中的某些行,条件是匹配名为 time
.
这是一个例子:
import numpy as np
import pandas as pd
a = {
'time':[1,2,3,4,5,6],
'column_1':[2,2,2,2,2,2],
'column_2':[3,3,3,3,3,3]
}
b = {
'time':[3,4,5],
'column_1':[0,0,0],
'column_2':[0,0,0]
}
data_1 = pd.DataFrame(a)
data_2 = pd.DataFrame(b)
在结果中,我想得到这样的数据框:
time column_1 column_2
0 1 2 3
1 2 2 3
2 3 0 0
3 4 0 0
4 5 0 0
5 6 2 3
我尝试了 Pandas 中的合并和替换方法,但没有成功。我做了掩码布尔数组:
time_1 = list(data_1['time'])
time_2 = list(data_2['time'])
mask_array = np.zeros(len(time_1),dtype = bool)
for i, item in enumerate(time_1):
if item in time_2:
mask_array[i] = True
我收到了:
array([False, False, True, True, True, False])
但我无法用 data_2
值替换 data_1
值。我做错了什么?这似乎不是一项艰巨的任务,但我找不到任何有用的东西,只是不知道该怎么做。我对 pandas 没有太多经验,所以我可能有些不明白。
在data_1a
和data_1b
上对time
设置索引后就可以使用.update()
了,如下:
data_1a = data_1.set_index('time')
data_1a.update(data_2.set_index('time'))
data_out = data_1a.reset_index()
.update()
使用来自另一个 DataFrame 的非 NA 值就地修改。对齐索引。因此,当您将 time
设置为 data_1a
和 data_1b
上的索引时,.update()
与列 time
中的匹配值对齐以执行 [=23] 的更新=] 通过 data_2
.
的对应值
数据设置:
a = {
'time':[1,2,3,4,5,6],
'column_1':[2,2,2,2,2,2],
'column_2':[3,3,3,3,3,3]
}
b = {
'time':[3,4,5],
'column_1':[0,0,0],
'column_2':[0,0,0]
}
data_1 = pd.DataFrame(a)
data_2 = pd.DataFrame(b)
结果:
print(data_out)
time column_1 column_2
0 1 2.0 3.0
1 2 2.0 3.0
2 3 0.0 0.0
3 4 0.0 0.0
4 5 0.0 0.0
5 6 2.0 3.0
我正在尝试编写工作任务代码,因此我制作了一个模拟此任务的简单案例。我有两个数据框:data_1
和 data_2
,我想用 data_2
中的行替换 data_1
中的某些行,条件是匹配名为 time
.
这是一个例子:
import numpy as np
import pandas as pd
a = {
'time':[1,2,3,4,5,6],
'column_1':[2,2,2,2,2,2],
'column_2':[3,3,3,3,3,3]
}
b = {
'time':[3,4,5],
'column_1':[0,0,0],
'column_2':[0,0,0]
}
data_1 = pd.DataFrame(a)
data_2 = pd.DataFrame(b)
在结果中,我想得到这样的数据框:
time column_1 column_2
0 1 2 3
1 2 2 3
2 3 0 0
3 4 0 0
4 5 0 0
5 6 2 3
我尝试了 Pandas 中的合并和替换方法,但没有成功。我做了掩码布尔数组:
time_1 = list(data_1['time'])
time_2 = list(data_2['time'])
mask_array = np.zeros(len(time_1),dtype = bool)
for i, item in enumerate(time_1):
if item in time_2:
mask_array[i] = True
我收到了:
array([False, False, True, True, True, False])
但我无法用 data_2
值替换 data_1
值。我做错了什么?这似乎不是一项艰巨的任务,但我找不到任何有用的东西,只是不知道该怎么做。我对 pandas 没有太多经验,所以我可能有些不明白。
在data_1a
和data_1b
上对time
设置索引后就可以使用.update()
了,如下:
data_1a = data_1.set_index('time')
data_1a.update(data_2.set_index('time'))
data_out = data_1a.reset_index()
.update()
使用来自另一个 DataFrame 的非 NA 值就地修改。对齐索引。因此,当您将 time
设置为 data_1a
和 data_1b
上的索引时,.update()
与列 time
中的匹配值对齐以执行 [=23] 的更新=] 通过 data_2
.
数据设置:
a = {
'time':[1,2,3,4,5,6],
'column_1':[2,2,2,2,2,2],
'column_2':[3,3,3,3,3,3]
}
b = {
'time':[3,4,5],
'column_1':[0,0,0],
'column_2':[0,0,0]
}
data_1 = pd.DataFrame(a)
data_2 = pd.DataFrame(b)
结果:
print(data_out)
time column_1 column_2
0 1 2.0 3.0
1 2 2.0 3.0
2 3 0.0 0.0
3 4 0.0 0.0
4 5 0.0 0.0
5 6 2.0 3.0