konichiwa
konichiwa

Reputation: 551

How to evaluate Categories instead of Books in pandas (Python)?

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

Answers (1)

RCA
RCA

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

Related Questions