【问题标题】:I have a DF with 2 columns. I wanna do a boolean check on it我有一个 2 列的 DF。我想对其进行布尔检查
【发布时间】:2019-10-15 14:56:38
【问题描述】:

我有一个包含 3 列的 DF,我想执行布尔检查。代码如下所示。

import pandas as pd
df = pd.DataFrame({
    'Col1':[A,A,A,B,B,C,C,C],
    'Col2':[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],[1, 2, 3, 4, 5],[1, 2, 3, 4, 5], [1, 2, 3, 4, 5,6,7] ,[1, 2, 3, 4, 5,6,7],[1, 2, 3, 4, 5,6,7] ]
    'Col3': [[1, 2, 3, 4],[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],[1, 2, 3, 4, 5, 6, 7, 8, 9],[1, 2, 3, 4, 5],[1, 2, 3], [1, 2, 3, 4, 5,6,7] ,[1, 2, 3],[1, 2, 3, 4] ]
})

我想要一个 DF,它为我提供 Col1 的唯一值,如果 Col2、Col3 的一行相等,则打印 True,否则打印 False。我想看到的结果是:

'Col1' 'Col2'                         'Col3'          'Col4'                               
  A    [1,2,3,4,5,6,7,8,9,10,11,12]  [1,2,3,4]         False

print(map(type, df['Col2']) == map(type,df['Col3']))

这返回值 true,但我希望它作为 df 中的新列 Col4

对于我尝试的多个代码,我总是发现错误为unhashable type: 'list'

【问题讨论】:

  • df['Col4'] = df['Col2'] == df['Col3']?

标签: pandas list function dataframe set


【解决方案1】:

转换为字符串以允许比较:

    df['Col4'] = df.Col2.map(str) == df.Col3.map(str)

【讨论】:

    【解决方案2】:

    如果您想为每组Col1 应用此逻辑,请使用groupby.apply

    df['Col4'] = df.groupby('Col1').apply(lambda x: x['Col2'].eq(x['Col3'])).values
    
      Col1                                     Col2                                     Col3   Col4
    0    A  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]                             [1, 2, 3, 4]  False
    1    A  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]   True
    2    A  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]              [1, 2, 3, 4, 5, 6, 7, 8, 9]  False
    3    B                          [1, 2, 3, 4, 5]                          [1, 2, 3, 4, 5]   True
    4    B                          [1, 2, 3, 4, 5]                                [1, 2, 3]  False
    5    C                    [1, 2, 3, 4, 5, 6, 7]                    [1, 2, 3, 4, 5, 6, 7]   True
    6    C                    [1, 2, 3, 4, 5, 6, 7]                                [1, 2, 3]  False
    7    C                    [1, 2, 3, 4, 5, 6, 7]                             [1, 2, 3, 4]  False
    

    不考虑组,在这种情况下给出相同的输出,使用eq

    df['Col4'] = df['Col2'].eq(df['Col3'])
    
      Col1                                     Col2                                     Col3   Col4
    0    A  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]                             [1, 2, 3, 4]  False
    1    A  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]   True
    2    A  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]              [1, 2, 3, 4, 5, 6, 7, 8, 9]  False
    3    B                          [1, 2, 3, 4, 5]                          [1, 2, 3, 4, 5]   True
    4    B                          [1, 2, 3, 4, 5]                                [1, 2, 3]  False
    5    C                    [1, 2, 3, 4, 5, 6, 7]                    [1, 2, 3, 4, 5, 6, 7]   True
    6    C                    [1, 2, 3, 4, 5, 6, 7]                                [1, 2, 3]  False
    7    C                    [1, 2, 3, 4, 5, 6, 7]                             [1, 2, 3, 4]  False
    

    【讨论】:

      【解决方案3】:

      介绍一种新方式tuple

      df.Col2.map(tuple)==df.Col3.map(tuple)
      Out[646]: 
      0    False
      1     True
      2    False
      3     True
      4    False
      5     True
      6    False
      7    False
      dtype: bool
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-11
        • 2021-05-30
        • 2011-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多