基于2个ID获取不同列数据帧

2024-09-27 07:26:35 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,我怎样才能做,只有在2个数据帧val是不同的行。你知道吗

我需要的过滤方式如下:

对于F1的每一行(如果id1不为null,则取每个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

Tags: npnand2id2x02id1y1val1
1条回答
网友
1楼 · 发布于 2024-09-27 07:26:35

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

我想两个单独的合并:

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

在两个结果数据帧中,我只保留以下行:

  • 瓦尔1!=值2
  • 和(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

相关问题 更多 >

    热门问题