簡體   English   中英

將兩個數據框中的兩列與另一列上的條件進行比較

[英]Compare two columns in two dataframes with a condition on another column

我有一個多級數據框,我想將 column secret的值與 column group上的條件進行比較。 如果 group = A,我們允許另一個數據幀中的值為空或 na。 否則,為不匹配的輸出 INVALID。

多級數據框:

        name               secret              group
        df1     df2     df1     df2        df1     df2
id                       
1       Tim     Tim     random  na          A        A
2       Tom     Tom     tree                A        A
3       Alex    Alex    apple   apple       B        B
4       May     May     file    cheese      C        C

秘密的預期輸出

id     name    secret    group
1      Tim       na        A
2      Tom                 A
3      Alex     apple      B
4      May     INVALID     C

到目前為止我有:

result_df['result'] = multilevel_df.groupby(level=0, axis=0).apply(lambda x: secret_check(x)) 

#take care of the rest by compare column by column
result_df = multilevel_df.groupby(level=0, axis=1).apply(lambda x: validate(x))

def validate(x):
  if x[0] == x[1]:
        return x[1]
    else:
        return 'INVALID'

def secret_check(x): 
   if (x['group'] == 'A' and pd.isnull(['secret']):  #this line is off
      return x[1] 
   elif x[0] == x[1]:
      return x[1]
   else:
      return 'INVALID'

如果我理解正確,如果df1df2的機密不同並且組不是 A,您想將df2 “機密”標記為無效。

condition = (df[('secret', 'df1')] != df[('secret', 'df2')]) &\
             df[('group',  'df1')] != 'A')
df.loc[condition, ('secret', 'df2')] = 'INVALID'

假設我們有以下數據框:

df = pd.DataFrame({0: {0: 1, 1: 2, 2: 3, 3: 4},
 1: {0: 'Tim', 1: 'Tom', 2: 'Alex', 3: 'May'},
 2: {0: 'Tim', 1: 'Tom', 2: 'Alex', 3: 'May'},
 3: {0: 'random', 1: 'tree', 2: 'apple', 3: 'file'},
 4: {0: 'na', 1: '', 2: 'apple', 3: 'cheese'},
 5: {0: 'A', 1: 'A', 2: 'B', 3: 'C'},
 6: {0: 'A', 1: 'A', 2: 'B', 3: 'C'}})
df
df.columns = pd.MultiIndex.from_tuples([('id',''), ('name', 'df1'), ('name', 'df2'),
                            ('secret', 'df1'), ('secret', 'df2'), ('group', 'df1'), ('group', 'df2')])
df
In[1]: 
  id  name        secret         group    
       df1   df2     df1     df2   df1 df2
0  1   Tim   Tim  random      na     A   A
1  2   Tom   Tom    tree             A   A
2  3  Alex  Alex   apple   apple     B   B
3  4   May   May    file  cheese     C   C

  1. 您可以使用np.select()根據條件返回結果。
  2. .droplevel()退出多.droplevel()數據幀
  3. df.loc[:,~df.columns.duplicated()]刪除重復的列。 由於我們將答案設置為df1列,因此不需要df2列。

df[('secret', 'df1')] = np.select([(df[('group', 'df2')] != 'A') & 
                                   (df[('secret', 'df1')] != df[('secret', 'df2')])], #condition 1
                                  [df[('secret', 'df1')] + ' > ' + df[('secret', 'df2')]], #result 1
                                   df[('secret', 'df2')]) #alterantive if conditions not met
df.columns = df.columns.droplevel(1)
df = df.loc[:,~df.columns.duplicated()]
df
Out[1]: 
   id  name         secret group
0   1   Tim             na     A
1   2   Tom                    A
2   3  Alex          apple     B
3   4   May  file > cheese     C

暫無
暫無

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

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