【问题标题】:Compare two columns in two dataframes with a condition on another column将两个数据框中的两列与另一列的条件进行比较
【发布时间】:2020-10-05 23:09:05
【问题描述】:

我有一个多级数据框,我想将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'

【问题讨论】:

    标签: python pandas dataframe multi-level


    【解决方案1】:

    假设我们有以下数据框:

    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() 退出多索引数据框
    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
    

    【讨论】:

    • 一个关于使结果显示差异而不是无效的后续问题。输出文件 > 奶酪。
    • @Matt-pow 把这行代码[df[('secret', 'df2')], 'INVALID']改成[df[('secret', 'df2')], df[('secret', 'df2')]]
    • 哦,我的意思是输出看起来像“文件>奶酪”,所以我可以告诉它是从哪个值更改为哪个值。
    • @Matt-pow 将 [df[('secret', 'df2')], 'INVALID'] 更改为 [df[('secret', 'df2')], df[('secret', 'df1')] + ' > ' + df[('secret', 'df2')]]
    • 您介意解释第一个条件的用例是什么吗?如果只是 (df[('group', 'df2')] != 'A') & (df[('secret', 'df1')] != df[(' secret', 'df2')]) 返回无效。
    【解决方案2】:

    如果我的理解正确,如果df1df2 中的秘密不同并且该组不是A,你想将df2 中的“秘密”标记为无效。你去吧:

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

    【讨论】:

      猜你喜欢
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 2017-09-05
      相关资源
      最近更新 更多