反加入Pandas

2024-09-30 03:22:38 发布

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

我有两个表,我想附加它们,以便只有表A中的所有数据被保留,并且只有表B中的数据的键是唯一的(表A和表B中的键值是唯一的,但是在某些情况下,表A和表B中都会出现键)。

我认为这样做的方法将涉及某种过滤连接(反连接),以获取表B中不在表A中的值,然后追加这两个表。

我对R很熟悉,这是我在R中用来做这件事的代码

library("dplyr")

## Filtering join to remove values already in "TableA" from "TableB"
FilteredTableB <- anti_join(TableB,TableA, by = "Key")

## append "FilteredTableB" to "TableA"
CombinedTable <- bind_rows(TableA,FilteredTableB)

我如何在python中实现这一点?


Tags: to数据方法代码library情况remove键值
3条回答

我也有同样的问题。This answer使用mergehow='outer'indicator=True激发了我想出这个解决方案:

import pandas as pd
import numpy as np

TableA = pd.DataFrame(np.random.rand(4, 3),
                      pd.Index(list('abcd'), name='Key'),
                      ['A', 'B', 'C']).reset_index()
TableB = pd.DataFrame(np.random.rand(4, 3),
                      pd.Index(list('aecf'), name='Key'),
                      ['A', 'B', 'C']).reset_index()

print('TableA', TableA, sep='\n')
print('TableB', TableB, sep='\n')

TableB_only = pd.merge(
    TableA, TableB,
    how='outer', on='Key', indicator=True, suffixes=('_foo','')).query(
        '_merge == "right_only"')

print('TableB_only', TableB_only, sep='\n')

Table_concatenated = pd.concat((TableA, TableB_only), join='inner')

print('Table_concatenated', Table_concatenated, sep='\n')

打印此输出:

TableA
  Key         A         B         C
0   a  0.035548  0.344711  0.860918
1   b  0.640194  0.212250  0.277359
2   c  0.592234  0.113492  0.037444
3   d  0.112271  0.205245  0.227157
TableB
  Key         A         B         C
0   a  0.754538  0.692902  0.537704
1   e  0.499092  0.864145  0.004559
2   c  0.082087  0.682573  0.421654
3   f  0.768914  0.281617  0.924693
TableB_only
  Key  A_foo  B_foo  C_foo         A         B         C      _merge
4   e    NaN    NaN    NaN  0.499092  0.864145  0.004559  right_only
5   f    NaN    NaN    NaN  0.768914  0.281617  0.924693  right_only
Table_concatenated
  Key         A         B         C
0   a  0.035548  0.344711  0.860918
1   b  0.640194  0.212250  0.277359
2   c  0.592234  0.113492  0.037444
3   d  0.112271  0.205245  0.227157
4   e  0.499092  0.864145  0.004559
5   f  0.768914  0.281617  0.924693

merge命令中的indicator = True将通过创建具有三个可能值的新列_merge来告诉您应用了哪个联接:

  • left_only
  • right_only
  • both

您需要取right_only并将其追加回第一个表。就这样。

在使用后不要忘记删除_merge列。

outer_join = TableA.merge(TableB, how = 'outer', indicator = True)

anti_join_B_only = outer_join[outer_join._merge == 'right_only']

anti_join_B_only = anti_join_B_only.drop('_merge', axis = 1)

combined_table = TableA.merge(anti_join_B_only, how = 'outer')

别紧张!

考虑以下数据帧

TableA = pd.DataFrame(np.random.rand(4, 3),
                      pd.Index(list('abcd'), name='Key'),
                      ['A', 'B', 'C']).reset_index()
TableB = pd.DataFrame(np.random.rand(4, 3),
                      pd.Index(list('aecf'), name='Key'),
                      ['A', 'B', 'C']).reset_index()

TableA

enter image description here


TableB

enter image description here

这是做你想做的事的一种方法

方法1

# Identify what values are in TableB and not in TableA
key_diff = set(TableB.Key).difference(TableA.Key)
where_diff = TableB.Key.isin(key_diff)

# Slice TableB accordingly and append to TableA
TableA.append(TableB[where_diff], ignore_index=True)

enter image description here

方法2

rows = []
for i, row in TableB.iterrows():
    if row.Key not in TableA.Key.values:
        rows.append(row)

pd.concat([TableA.T] + rows, axis=1).T

计时

4行,2个重叠

方法1要快得多

enter image description here

10000行5000重叠

循环不正确

enter image description here

相关问题 更多 >

    热门问题