对pandas数据框运行逻辑表达式

3

我可以帮您进行翻译。以下是需要翻译的内容:

我正在尝试通过对列(以逻辑表达式的形式)应用条件来从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或-2434234242)且整个数据框中没有32536365654的userid。 对于情况2 - 我需要仅返回那些在数据框中具有两个代码(12324234234和-2434234242)或任何代码但不是32536365654的userid。
像下面这样的语句返回空数据框:
    flt = df[(df.code == 12324234234) & (df.code == -2434234242)]
    print("flt: ", flt)

结果(并且它很有意义):
    flt:  Empty DataFrame

感谢您对处理此类情况提供任何提示。
格式要求:

感谢您对处理此类情况提供任何提示。


条件似乎有点奇怪:对于情况1,“AND NOT 32536365654”是多余的;对于情况2,“(12324234234 AND -2434234242)”也是多余的。 - YS-L
条件方面一切正常。对于情况1,我只需要那些至少拥有以下值之一(12324234234或-2434234242)且在整个数据框中没有32536365654的userid。对于情况2,一切正常,我只需要那些在数据框中拥有这两个代码或任何代码但不是32536365654的userid。 - Alex
你可以通过代码32536365654找到用户,然后使用df [~ df.userid.isin()]方法选择没有该代码的用户。请参阅https://dev59.com/mGIj5IYBdhLWcg3wuHTP - matt_s
1个回答

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”变量将包含每个用户ID的布尔测试结果。”

谢谢你,@pbarber!它运行得很好。唯一的问题是,在表单中定义案例,例如(-1111111AND2222222)NOT(-3333333),我使用regexp将它们转换为适当的形式case = '((presence[-1111111] & presence[2222222]) &~ (presence[-3333333]))'以执行布尔测试。由于此案例具有String类型,因此评估它的唯一方法是使用eval(case)。您是否有任何想法或其他可用选项来评估这些案例? - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接