Reputation: 551
I've completely reformulated my question. I am pretty sure makes way more sense now.
I have the following condition: logic1 & (logic2 | logic3) & logic4
.
All books of a Category
should be flagged as Evaluated
, once at least 1 book satisfies the condition. How can I do this for every CategoryID
?
Logic CategoryEvaluated
logic1 = (books['CategoryPopulair'] == True)
logic2 = (books['BookTitle'] == 'Hello1') & (books['BookRead'] == True) & (books['BookNice'] == True)
logic3 = (books['BookTitle'].isin(['Hello2', 'Hello3'])) & (books['BookNice'] == True) & (books['BookOld'] == True)
logic4 = (books['BookYear'].isin([393, 1962, 1964, 3295]))
Input
| CategoryID | BookID | BookStatus | BookTitle | BookRead | BookNice | BookOld | BookYear | CategoryPopulair |
|------------|--------|------------|-----------|----------|----------|---------|----------|------------------|
| 337830 | 1 | 4 | Hello1 | TRUE | TRUE | TRUE | 1964 | TRUE |
| 337830 | 2 | 4 | Hello2 | | TRUE | TRUE | 1964 | TRUE |
| 337830 | 3 | 1 | Hello3 | | TRUE | TRUE | 1964 | TRUE |
| 337830 | 4 | 1 | Hello4 | | TRUE | TRUE | 1964 | TRUE |
| 337830 | 5 | 1 | Hello5 | | TRUE | FALSE | 1964 | TRUE |
| 337830 | 6 | 1 | Hello6 | | TRUE | FALSE | 1964 | TRUE |
| 337830 | 7 | 1 | Hello7 | | TRUE | TRUE | 1964 | TRUE |
| 337830 | 8 | 1 | Hello8 | | TRUE | FALSE | 1964 | TRUE |
| 337830 | 9 | 1 | Hello9 | | TRUE | TRUE | 1964 | TRUE |
| 337830 | 10 | 1 | Hello10 | | TRUE | FALSE | 1964 | TRUE |
| 337830 | 11 | 1 | Hello11 | | TRUE | TRUE | 1964 | TRUE |
| 337830 | 12 | 1 | Hello12 | | TRUE | TRUE | 1964 | TRUE |
| 331232 | 1 | 4 | Hello1 | TRUE | TRUE | TRUE | 1964 | TRUE |
| 331232 | 2 | 4 | Hello2 | TRUE | TRUE | TRUE | 1964 | TRUE |
| 331232 | 13 | 1 | Hello13 | | TRUE | TRUE | 1964 | TRUE |
| 331232 | 14 | 1 | Hello14 | | TRUE | TRUE | 1964 | TRUE |
| 331232 | 5 | 1 | Hello5 | | TRUE | FALSE | 1964 | TRUE |
| 331232 | 6 | 1 | Hello6 | | TRUE | FALSE | 1964 | TRUE |
| 331232 | 15 | 1 | Hello15 | | TRUE | TRUE | 1964 | TRUE |
| 331232 | 8 | 1 | Hello8 | | TRUE | FALSE | 1964 | TRUE |
| 331232 | 9 | 1 | Hello9 | TRUE | TRUE | TRUE | 1964 | TRUE |
| 331232 | 10 | 1 | Hello10 | | TRUE | FALSE | 1964 | TRUE |
| 331232 | 17 | 1 | Hello17 | TRUE | TRUE | TRUE | 1964 | TRUE |
| 331232 | 16 | 1 | Hello16 | | TRUE | TRUE | 1964 | TRUE |
Output I need (see column CategoryEvaluated)
FALSE in column BookOld
of BookID
2 with CategoryID
331232 causes CategoryEvaluated
to be FALSE.
| CategoryID | BookID | BookStatus | BookTitle | BookRead | BookNice | BookOld | BookYear | CategoryPopulair | CategoryEvaluated |
|------------|--------|------------|-----------|----------|----------|---------|----------|------------------|-------------------|
| 337830 | 1 | 4 | Hello1 | TRUE | TRUE | TRUE | 1964 | TRUE | TRUE |
| 337830 | 2 | 4 | Hello2 | | TRUE | TRUE | 1964 | TRUE | TRUE |
| 337830 | 3 | 1 | Hello3 | | TRUE | TRUE | 1964 | TRUE | TRUE |
| 337830 | 4 | 1 | Hello4 | | TRUE | TRUE | 1964 | TRUE | TRUE |
| 337830 | 5 | 1 | Hello5 | | TRUE | FALSE | 1964 | TRUE | TRUE |
| 337830 | 6 | 1 | Hello6 | | TRUE | FALSE | 1964 | TRUE | TRUE |
| 337830 | 7 | 1 | Hello7 | | TRUE | TRUE | 1964 | TRUE | TRUE |
| 337830 | 8 | 1 | Hello8 | | TRUE | FALSE | 1964 | TRUE | TRUE |
| 337830 | 9 | 1 | Hello9 | | TRUE | TRUE | 1964 | TRUE | TRUE |
| 337830 | 10 | 1 | Hello10 | | TRUE | FALSE | 1964 | TRUE | TRUE |
| 337830 | 11 | 1 | Hello11 | | TRUE | TRUE | 1964 | TRUE | TRUE |
| 337830 | 12 | 1 | Hello12 | | TRUE | TRUE | 1964 | TRUE | TRUE |
| 331232 | 1 | 4 | Hello1 | TRUE | TRUE | TRUE | 1964 | TRUE | FALSE |
| 331232 | 2 | 4 | Hello2 | TRUE | TRUE |->FALSE<-| 1964 | TRUE | FALSE |
| 331232 | 13 | 1 | Hello13 | | TRUE | TRUE | 1964 | TRUE | FALSE |
| 331232 | 14 | 1 | Hello14 | | TRUE | TRUE | 1964 | TRUE | FALSE |
| 331232 | 5 | 1 | Hello5 | | TRUE | FALSE | 1964 | TRUE | FALSE |
| 331232 | 6 | 1 | Hello6 | | TRUE | FALSE | 1964 | TRUE | FALSE |
| 331232 | 15 | 1 | Hello15 | | TRUE | TRUE | 1964 | TRUE | FALSE |
| 331232 | 8 | 1 | Hello8 | | TRUE | FALSE | 1964 | TRUE | FALSE |
| 331232 | 9 | 1 | Hello9 | TRUE | TRUE | TRUE | 1964 | TRUE | FALSE |
| 331232 | 10 | 1 | Hello10 | | TRUE | FALSE | 1964 | TRUE | FALSE |
| 331232 | 17 | 1 | Hello17 | TRUE | TRUE | TRUE | 1964 | TRUE | FALSE |
| 331232 | 16 | 1 | Hello16 | | TRUE | TRUE | 1964 | TRUE | FALSE |
Upvotes: 0
Views: 59
Reputation: 508
Edited to answer your question better.
Because any()
can be kind of tricky, I tend to create a boolean column and then evaluate that per group. You'll do all your logic per book, then check if any book satisfied the criteria.
books['FitsLogic'] = logic1 & (logic2 | logic3) & logic4
books['CategoryEvaluted'] = books['FitsLogic'].groupby(books['CategoryID']).transform(
lambda x: True if any(x) else False)
Upvotes: 1