簡體   English   中英

Pandas 單行多重比較

[英]Pandas multiple comparison on a single row

我的源數據如下所示:

data = { 'id': [1,2,3,4,5],
         '1_src1': ['a', 'b','c', 'd', 'e'] ,
       '1_src2': ['a', 'b','c', 'd', 'e'] ,
       '2_src1': ['a', 'b','f', 'd', 'e'] ,
       '2_src2': ['a', 'b','c', 'd', 'e'] ,
       '3_src1': ['a', 'b','c', 'd', 'e'] ,
       '3_src2': ['a', 'b','1', 'd', 'm'] }
pd.DataFrame(data)

在此處輸入圖像描述

我需要將第二列與第三列、第四列與第五列、第六列與第七列進行比較。 列名可以更改。 所以我必須考慮列位置,我的第一列總是將列名作為 id。

因此,如果至少一個比較 ('1_src1' vs '1_src2') ('2_src1' vs '2_src2') 失敗,如果需要更新 1 else 0。但是如果 (3_src1 vs 3_src2) 的比較失敗,如果需要更新 2 else 0。

我的結果應該如下所示:

![在此處輸入圖像描述

我試過的代碼:

我嘗試創建這樣的列子集。 但我無法繼續我怎樣才能達到這個結果。

cols_comp = []
for i in range(0,len(x),2):
    cols_comp.append(x[i:i+2])

任何幫助表示贊賞。 謝謝。

您可以使用:

import numpy as np

# compare columns by pair after 1st one
comp = df.iloc[:, 1::2].ne(df.iloc[:, 2::2].to_numpy())

# select rules
                     # True in last     # True in first 2 comp
df['res'] = np.select([comp.iloc[:, 2], comp.iloc[:, :2].any(1)],
                      [2, 1], # matching values
                      0) # default

output:

   id 1_src1 1_src2 2_src1 2_src2 3_src1 3_src2  res
0   1      a      a      a      a      a      a    0
1   2      b      b      b      b      b      b    0
2   3      c      c      f      c      c      1    2
3   4      d      d      b      d      d      d    1
4   5      e      e      e      e      e      m    2

首先,我根據您的 3 個比較創建三個單獨的條件列。 然后將這些應用到您的規則中。

df = pd.DataFrame(data)

cond1 = df.iloc[:, 1] != df.iloc[:, 2]
cond2 = df.iloc[:, 3] != df.iloc[:, 4]
cond3 = df.iloc[:, 5] != df.iloc[:, 6]

df['res'] = 0
df.loc[cond1 | cond2, 'res'] = 1
df.loc[cond3, 'res'] = 2

暫無
暫無

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

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