亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

查找列之間不匹配的條目并循環訪問列

查找列之間不匹配的條目并循環訪問列

白衣染霜花 2022-08-16 10:05:59
我有兩個需要驗證的數據集。所有記錄都應匹配。我在確定如何循環訪問每個不同的列時遇到問題。import pandas as pd import numpy as npdf = pd.DataFrame([['charlie', 'charlie', 'beta', 'cappa'], ['charlie', 'charlie', 'beta', 'delta'], ['charlie', 'charlie', 'beta', 'beta']], columns=['A_1', 'A_2','B_1','B_2'])df.head()Out[83]:        A_1      A_2   B_1    B_20  charlie  charlie  beta  cappa1  charlie  charlie  beta  delta2  charlie  charlie  beta   beta例如,在上面的代碼中,我想將A_1與A_2進行比較,B_1 B_2,分別返回一個新列,分別A_check和B_check,如果A_1與A_Check A_2匹配,則返回True。像這樣:df['B_check'] = np.where((df['B_1'] == df['B_2']), 'True', 'False')df_subset = df[df['B_check']=='False'] 但是,可以在任何給定的列名中迭代,其中需要檢查的列在下劃線之前始終具有相同的名稱,并且在下劃線后始終具有1或2。最終,實際任務具有多個數據框,其中要檢查的列不同,以及要檢查的列數也不同。我最終要獲得的輸出是一個數據幀,它顯示對于任何特定列檢查都是假的所有記錄。
查看完整描述

4 回答

?
LEATH

TA貢獻1936條經驗 獲得超7個贊

使用更全面的正則表達式:


from itertools import groupby

import re


for k, cols in groupby(sorted(df.columns), lambda x: x[:-2] if re.match(".+_(1|2)$", x) else None):

    cols=list(cols)

    if(len(cols)==2 and k):

        df[f"{k}_check"]=df[cols[0]].eq(df[cols[1]])

它將僅將名稱以和名稱結尾的列配對在一起,而不管您之前在其名稱中有什么,僅當有2-和(假設您沒有2列具有相同名稱)時才計算。_1_2_check_1_2


對于示例數據:


       A_1      A_2   B_1    B_2  A_check  B_check

0  charlie  charlie  beta  cappa     True    False

1  charlie  charlie  beta  delta     True    False

2  charlie  charlie  beta   beta     True     True


查看完整回答
反對 回復 2022-08-16
?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

如果您知道列名稱的第一部分,則可以使用wide_to_long,即...:A,B


(pd.wide_to_long(df.reset_index(), ['A','B'], 'index','part',sep='_')

   .groupby('index').nunique().eq(1)

   .add_suffix('_check')

)

輸出:


       A_check  B_check

index                  

0         True    False

1         True    False

2         True     True


查看完整回答
反對 回復 2022-08-16
?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

您可以拆分列并按拆分結果的第一個值的序列進行分組,并調用以進行比較axis=1agg


i_cols = df.columns.str.split('_')

df_check = (df.groupby(i_cols.str[0], axis=1).agg(lambda x: x.iloc[:,0] == x.iloc[:,-1])

              .add_suffix('_check'))


In [69]: df_check

Out[69]:

   A_check  B_check

0     True    False

1     True    False

2     True     True


查看完整回答
反對 回復 2022-08-16
?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

另一種方法是使用 pd 使用數據幀重整。多索引:


df = pd.DataFrame([['charlie', 'charlie', 'beta', 'cappa'], 

                   ['charlie', 'charlie', 'beta', 'delta'], 

                   ['charlie', 'charlie', 'beta', 'beta']], 

                  columns=['A_1', 'A_2','B_1','B_2'])


df.columns = df.columns.str.split('_', expand=True) #Creates MultiIndex column header

dfs = df.stack(0) #move the 'A' and 'B' and any others to rows

df_out = (dfs == dfs.shift(-1, axis=1))['1'].unstack() #Compare column 1 to column 2 and move 'A's and 'B's back to columns.

print(df_out)

輸出:


      A      B

0  True  False

1  True  False

2  True   True


查看完整回答
反對 回復 2022-08-16
  • 4 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號