gpt4 book ai didi

python - 根据 2 个 id 获取不同的列数据框

转载 作者:行者123 更新时间:2023-12-01 07:45:17 24 4
gpt4 key购买 nike

您好,我该如何仅处理 2 个数据帧中 val 不同的行。

我需要过滤的方式如下:

对于 F1 的每一行(如果不为空,则取每个 id1 搜索 id1 F2 )比较 VAL,如果不同则返回它。否则查看 id2 并执行相同的操作。

请注意,我可以有 id1 或 id2 或两者都有,如下所示:

d2 = {'id1': ['X22', 'X13',np.nan,'X02','X14'],'id2': ['Y1','Y2','Y3','Y4',np.nan],'VAL1':[1,0,2,3,0]}
F1 = pd.DataFrame(data=d2)
d2 = {'id1': ['X02', 'X13',np.nan,'X22','X14'],'id2': ['Y4','Y2','Y3','Y1','Y22'],'VAL2':[1,0,4,3,1]}
F2 = pd.DataFrame(data=d2)

F1 所在位置:

   id1  id2  VAL1
0 X22 Y1 1
1 X13 Y2 0
2 NaN Y3 2
3 X02 Y4 3
4 X14 NaN 0

F2 是:

   id1  id2  VAL2
0 X02 Y4 1
1 X13 Y2 0
2 NaN Y3 4
3 X22 Y1 3
4 X14 Y22 1

预期输出:

d2 = {'id1': ['X02',np.nan,'X22','X14'],'id2': ['Y4','Y3','Y1',np.nan],'VAL1':[3,2,1,0],'VAL2':[1,4,3,1]}
F3 = pd.DataFrame(data=d2)

id1 id2 VAL1 VAL2
0 X02 Y4 3 1
1 NaN Y3 2 4
2 X22 Y1 1 3
3 X14 NaN 0 1

最佳答案

好吧,这是一个相当复杂的合并,因为您想要合并 2 列,并且其中任何列都可以包含 NaN,它应该匹配任何内容(但不能同时匹配两者)。

我想进行 2 个单独的合并:

  • 首先,在 id1 上的 F1 中,id1 不是 NaN
  • 第二个,其中 id1id2 上的 F1 中为 NaN

在两个结果数据框中,我只会将行保留在以下位置:

  • VAL1 != VAL2
  • AND(F1.id2 == F2.id2 或 F1.id2 为 NaN 或 F2.id2 为 NaN)

然后我会将它们连接起来。代码可以是:

t = F1.loc[~F1['id1'].isna()].merge(F2, on=['id1']).query('VAL1!=VAL2')
t = t[(t.id2_x==t.id2_y)|t.id2_x.isna()|t.id2_y.isna()]

t2 = F1.loc[F1['id1'].isna()].merge(F2, on=['id2']).query('VAL1!=VAL2')
t2 = t2[(t2.id1_x==t2.id1_y)|t2.id1_x.isna()|t2.id1_y.isna()]

# build back lost columns
t['id2'] = np.where(t['id2_x'].isna(), t['id2_y'], t['id2_x'])
t2['id1'] = np.where(t2['id1_x'].isna(), t2['id1_y'], t2['id1_x'])

# concat and reorder the columns
resul = pd.concat([t.drop(columns=['id2_x', 'id2_y']),
t2.drop(columns=['id1_x', 'id1_y'])],
ignore_index=True, sort=True).reindex(columns=
['id1', 'id2', 'VAL1', 'VAL2'])

结果是:

   id1  id2  VAL1  VAL2
0 X22 Y1 1 3
1 X02 Y4 3 1
2 X14 Y22 0 1
3 NaN Y3 2 4

关于python - 根据 2 个 id 获取不同的列数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56494062/

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