0

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             |
konichiwa
  • 532
  • 1
  • 5
  • 23
  • You should really make this example [reproducible](https://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples). – cmaher Apr 04 '18 at 15:10
  • 1
    I suspect you wouldn't like to get the answer as an image so don't post images yourself. Please add example of input and desired output. – zipa Apr 04 '18 at 15:11
  • I basically want to do `worlds['BlaIsC'] = logic1 & (logic2 | logic3) & logic4` per `BlaID` instead of every row. – konichiwa Apr 04 '18 at 15:12
  • I wish the first paragraph of the question was bit more clear. – Shridhar R Kulkarni Apr 04 '18 at 15:12
  • I will try to improve my question. Sorry for confusing you guys... – konichiwa Apr 04 '18 at 15:12
  • have you looked at the [`any()`](https://docs.python.org/2/library/functions.html#any)? – MattR Apr 04 '18 at 15:26
  • I've updated my question. Hope it makes more sense now... – konichiwa Apr 04 '18 at 15:35
  • May be you could implement this using Pandas apply function. Here is an [example](https://stackoverflow.com/questions/16353729/pandas-how-to-use-apply-function-to-multiple-columns#16354730) – Avikd Apr 04 '18 at 15:52

1 Answers1

1

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)
RCA
  • 508
  • 4
  • 12