簡體   English   中英

如何在 pandas 中依次檢查數據幀的某些行是否在多個數據幀中匹配

[英]How can I check if some rows of a data frame has matches in multiple data frames, sequentially in pandas

我有一個 dataframe 有以下數據

ID 打印體積
一個 100
b 200
c 250

假設上表代表圖書館中的書籍。 我們將依次檢查一本書是否與它擁有的 3 個讀者中的任何一個一起出現。 請注意,在這些情況下,列名都是不同的。

讀者 1

姓名 體積
c 100
一個 120
c 250

讀者 2

版本
一個 100
b 200
c 250

讀者 3

書名 打印
p 100
b 200
n 250

預期 output

ID 打印體積 當下
一個 100 2
b 200 3
c 250 1

在這里,即使讀者 1 和讀者 2 擁有相同卷的圖書 c,我們在當前列中標記 1,因為我們依次檢查讀者 1、2 和 3。 如果已經找到了一些東西,那么我們就不要再往前看了。

這就是我現在正在做的事情:

def check_for_book(library_df,reader_df,reader_id):
        subset_to_check=library_df[library_df['present']=='not_found']
        subset_to_check=pd.merge(subset_to_check,reader_df,on=<columns>,how='left',indicator='found')
        subset_to_check['present']=np.where(subset_to_check['found']=='both',reader_id, 'not_found')
        return(pd.concat([subset_to_check,library_df[library_df['present']!='not_found']))

library_df['present']='not_found'
library_df=check_for_book(library_df,reader_df1,'1')
library_df=check_for_book(library_df,reader_df2,'2')
library_df=check_for_book(library_df,reader_df2,'2')

我無法找出錯誤,我得到的結果不一致。 有沒有更好的方法以更好的方式連接這些數據框?

謝謝

如果你想逐行順序檢查,那么你可以使用:

result = []
for n in test.values:
    for i,j,k  in zip(df1.values, df2.values, df3.values):
        if (n == i).all():
            result.append([n[0],n[1],1])
            break
        elif (n == j).all():
            result.append([n[0],n[1],2])
            break
        elif (n == k).all():
            result.append([n[0],n[1],3])
            break
        
final_df = pd.DataFrame(result)

NOTE :假設第一個 df 名稱是test和 rest 3 - df1 , df2 , df3

讓我們嘗試一下:

import pandas as pd

df = pd.DataFrame({
    'id': {0: 'A', 1: 'b', 2: 'c'}, 'print_volume': {0: 100, 1: 200, 2: 250}
})

reader1 = pd.DataFrame({
    'name': {0: 'c', 1: 'A', 2: 'c'}, 'volume': {0: 100, 1: 120, 2: 250}
})
reader2 = pd.DataFrame({
    'book': {0: 'A', 1: 'b', 2: 'c'}, 'vers': {0: 100, 1: 220, 2: 250}
})
reader3 = pd.DataFrame({
    'book_name': {0: 'p', 1: 'b', 2: 'n'}, 'print': {0: 100, 1: 200, 2: 250}
})

readers = []
# Rename Columns so they are uniform with df
# Add indicator to each readers
for i, r_df in enumerate((reader1, reader2, reader3)):
    r_df.columns = df.columns
    r_df['present'] = i + 1
    readers.append(r_df)

# Create Readers
readers = pd.concat(readers, axis=0).drop_duplicates(df.columns, keep='first')
# Merge DF and Readers Together
new_df = df.merge(readers, on=df.columns.tolist(), how='left')
print(new_df)

new_df

  id  print_volume  present
0  A           100        2
1  b           200        3
2  c           250        1

向每個閱讀器添加一個指示符,以便可以識別 DataFrame,然后連接在一起並刪除重復項,因此只保留第一個 dataframe:

readers

  id  print_volume  present
0  c           100        1
1  A           120        1
2  c           250        1
0  A           100        2
1  b           220        2
0  p           100        3
1  b           200        3
2  n           250        3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM