针对pandas数据帧运行逻辑表达式

时间:2015-09-18 07:42:46

标签: python pandas dataframe logical-operators

我试图通过将条件应用于列(以逻辑表达式的形式)从pandas数据框中选择行。

示例数据框如下所示:

    id             userid                code
    0            645382311          12324234234
    1            645382311          -2434234242
    2            645382312          32536365654
    3            645382312          12324234234

...

例如,我希望通过对列'code'应用逻辑表达式来获得下一个结果:

    case 1: (12324234234 OR -2434234242) AND NOT 32536365654
    case 2: (12324234234 AND -2434234242) OR NOT 32536365654
    must give a result for both cases:
    userid: 645382311

上面的逻辑说: 对于情况1 - 只给我那些至少有一个值(12324234234 OR -2434234242)并且在整个数据框中没有32536365654的用户ID。 对于案例2 - 我只需要那些在数据框中包含这两个代码(12324234234 AND -2434234242)或任何代码但不包含32536365654的用户ID。

如下所示的语句返回空DataFrame:

    flt = df[(df.code == 12324234234) & (df.code == -2434234242)]
    print("flt: ", flt)

结果(并且它有意义):

    flt:  Empty DataFrame

对于处理此类案件的任何提示将不胜感激。

1 个答案:

答案 0 :(得分:1)

作为一种简单的方法,我会将您的样本表转换为布尔存在矩阵,然后允许您执行所需的逻辑:

import pandas
sample = pandas.DataFrame([[645382311, 12324234234], [645382311, -2434234242], [645382312, 32536365654], [645382312, 12324234234]], columns=['userid', 'code'])
# Add a column of True values
sample['value'] = True
# Pivot to boolean presence matrix and remove MultiIndex
presence = sample.pivot(index='userid', columns='code').fillna(False)['value']
# Perform desired boolean tests
case1 = (presence[12324234234] | presence[-2434234242]) & ~(presence[32536365654])
case2 = (presence[12324234234] & presence[-2434234242]) | ~(presence[32536365654])

case变量将包含每个用户标识的布尔测试结果。