a

Câu hỏi Chống tham gia gấu trúc


Tôi có hai bảng và tôi muốn nối thêm chúng để chỉ tất cả dữ liệu trong bảng A được giữ lại và dữ liệu từ bảng B chỉ được thêm nếu khóa của nó là duy nhất (các giá trị khóa là duy nhất trong bảng A và B tuy nhiên trong một số trường hợp Khóa sẽ xuất hiện trong cả bảng A và B).

Tôi nghĩ rằng cách để làm điều này sẽ liên quan đến một số loại lọc tham gia (chống tham gia) để có được các giá trị trong bảng B không xảy ra trong bảng A sau đó nối thêm hai bảng.

Tôi quen thuộc với R và đây là mã tôi sẽ sử dụng để làm điều này trong 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)

Làm thế nào tôi sẽ đạt được điều này trong python?


16
2017-07-22 01:05


gốc


Bạn có nghĩa là chỉ mục hàng, chỉ mục cột hoặc ô? - Jossie Calderon
Theo khóa i có nghĩa là một cột chứa trong cả hai bảng có giá trị để hợp nhất. - Ayelavan
Tôi đã thêm một câu trả lời. Vui lòng cho tôi biết suy nghĩ của bạn thông qua phản hồi và nếu bạn giải quyết bài tập của mình. Cảm ơn bạn! - Jossie Calderon
Đầu vào mong muốn và đầu ra mong muốn là gì? - tommy.carstensen


Các câu trả lời:


Xem xét các khung dữ liệu sau

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

Đây là một cách để làm những gì bạn muốn

Phương pháp 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

Phương pháp 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

Thời gian

4 hàng có 2 chồng chéo

Phương pháp 1 nhanh hơn nhiều

enter image description here

10.000 hàng 5.000 chồng chéo

vòng lặp là xấu

enter image description here


10
2017-07-22 01:38



Cảm ơn. Chỉ cần có một cái nhìn tại các tài liệu cho combine_first và nó có vẻ là loại những gì tôi đang tìm kiếm. Tuy nhiên, làm cách nào để chỉ định cột để kết hợp trên (khóa)? Đối với mỗi hàng trong Bảng BI muốn nó kiểm tra giá trị trong cột "Key" và nếu giá trị đó được chứa trong cột "Khóa" của Bảng A, tôi muốn bỏ qua hàng đó trong B. Trong trường hợp có giá trị khóa trong bảng B không có trong Bảng AI muốn chắp thêm hàng đó từ Bảng B. - Ayelavan
@Ayelavan sau khi nghĩ về nó, tôi không thể khuyên bạn nên combine_first. Vấn đề là nếu một khóa tồn tại trong A nhưng một số cột là null, các giá trị rỗng đó có thể được điền bằng các giá trị của B bằng cùng một khóa. câu trả lời cho câu hỏi mà bạn đặt ra trong nhận xét là combine_first hy vọng khóa sẽ nằm trong chỉ mục. - piRSquared
Đó là chính xác những gì tôi đang tìm kiếm. Cảm ơn nhiều - Ayelavan


Tôi đã từng gặp vấn đề tương tự. Câu trả lời này sử dụng how='outer' và indicator=True của hợp nhất đã truyền cảm hứng cho tôi để đưa ra giải pháp này:

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')

Mà in đầu ra này:

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

3
2018-05-26 11:48





Bạn sẽ có cả hai bảng TableA và TableB như vậy mà cả hai DataFrame các đối tượng có các cột với các giá trị duy nhất trong các bảng tương ứng của chúng, nhưng một số cột có thể có các giá trị xảy ra đồng thời (có cùng giá trị cho một hàng) trong cả hai bảng.

Sau đó, chúng tôi muốn hợp nhất các hàng trong TableA với các hàng trong TableB không khớp với bất kỳ TableA cho cột 'Khóa'. Khái niệm này là để hình dung nó khi so sánh hai chuỗi chiều dài biến đổi và kết hợp các hàng trong một chuỗi sA với người khác sB nếu sBGiá trị của không khớp sA'S. Đoạn mã sau giải quyết bài tập này:

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)

Lưu ý điều này ảnh hưởng TableBcủa dữ liệu là tốt. Bạn có thể dùng inplace=False và gán lại nó cho newTable, sau đó TableA.append(newTable) cách khác.

# 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

1
2017-07-22 07:29



Làm việc một điều trị. Cảm ơn bạn. - Ayelavan


Câu trả lời dễ nhất có thể tưởng tượng được:

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()]

Nên được đề xuất nhanh nhất là tốt.


0
2017-07-31 01:31