我试图通过将条件应用于列(以逻辑表达式的形式)从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
对于处理此类案件的任何提示将不胜感激。
答案 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
变量将包含每个用户标识的布尔测试结果。