比较两个数据帧中的两列以及另一列的条件

问题描述

我有一个多级数据框,我想将列secret中的值与列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'

解决方法

如果我理解的正确,那么如果df2df1中的秘密不同并且该组不是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',3: {0: 'random',1: 'tree',2: 'apple',3: 'file'},4: {0: 'na',1: '',3: 'cheese'},5: {0: 'A',1: 'A',2: 'B',3: 'C'},6: {0: 'A',3: 'C'}})
df
df.columns = pd.MultiIndex.from_tuples([('id',''),('name','df1'),'df2'),('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()脱离多索引数据框
  3. df.loc[:,~df.columns.duplicated()]删除重复的列。由于我们将答案设置为df1列,因此不需要df2列。

df[('secret','df1')] = np.select([(df[('group','df2')] != 'A') & 
                                   (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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...