58

2 つのテーブルがあり、それらを追加して、テーブル A のすべてのデータのみが保持され、キーが一意である場合にのみテーブル B のデータが追加されるようにしたいと考えています (キー値はテーブル A と B で一意ですが、場合によってはキーはテーブル A と B の両方で発生します)。

これを行う方法には、テーブル A では発生しないテーブル B の値を取得し、2 つのテーブルを追加するための何らかのフィルタリング結合 (アンチ結合) が必要になると思います。

私は 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でこれをどのように達成しますか?

4

7 に答える 7

9

私も同じ問題を抱えていました。およびマージを使用したこの回答は、このソリューションを思い付くきっかけになりました。how='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
于 2017-05-26T11:48:57.017 に答える
4

想像できる最も簡単な答え:

tableB = pd.concat([tableB, pd.Series(1)], axis=1)
mergedTable = tableA.merge(tableB, how="left" on="key")

answer = mergedTable[mergedTable.iloc[:,-1].isnull()][tableA.columns.tolist()]

提案された中で最も速いはずです。

于 2018-07-31T01:31:04.347 に答える
1

両方のテーブルがTableAありTableB、両方のDataFrameオブジェクトがそれぞれのテーブルに一意の値を持つ列を持つようになりますが、一部の列は両方のテーブルで同時に発生する値を持つ (行に同じ値を持つ) 場合があります。

次に、 「キー」列のどのTableA行にTableBも一致しない行と行をマージします。TableA概念は、可変長の 2 つの系列を比較し、 の値が の値と一致しない場合に一方の系列の行を他方の系列と結合するものとしてイメージsAすることsBです。次のコードは、この演習を解決します。sBsA

import pandas as pd

TableA = pd.DataFrame([[2, 3, 4], [5, 6, 7], [8, 9, 10]])
TableB = pd.DataFrame([[1, 3, 4], [5, 7, 8], [9, 10, 0]])

removeTheseIndexes = []
keyColumnA = TableA.iloc[:,1] # your 'Key' column here
keyColumnB = TableB.iloc[:,1] # same

for i in range(0, len(keyColumnA)):
    firstValue = keyColumnA[i]
    for j in range(0, len(keyColumnB)):
        copycat = keyColumnB[j]
        if firstValue == copycat:
            removeTheseIndexes.append(j)

TableB.drop(removeTheseIndexes, inplace = True)
TableA = TableA.append(TableB)
TableA = TableA.reset_index(drop=True)

TableBこれはのデータにも影響することに注意してください。inplace=Falseそれを使用して に再割り当てしnewTable、代わりに使用することができますTableA.append(newTable)

# Table A
   0  1   2
0  2  3   4
1  5  6   7
2  8  9  10

# Table B
   0   1  2
0  1   3  4
1  5   7  8
2  9  10  0

# Set 'Key' column = 1
# Run the script after the loop

# Table A
   0   1   2
0  2   3   4
1  5   6   7
2  8   9  10
3  5   7   8
4  9  10   0

# Table B
   0   1  2
1  5   7  8
2  9  10  0
于 2016-07-22T07:29:20.080 に答える