创建一个基于条件的布尔数据框。

huangapple go评论88阅读模式
英文:

how to create a mask Boolean data frame based on a condition

问题

以下是已翻译的数据部分:

  1. 我有一个数据框如下;
  2. |may | apr | mar |feb|jan|dec|
  3. | -- | ----|-----|---|---|---|
  4. | 0 | 0 | 0 | 1 |2 | 3 |
  5. | 1 | 2 | 3 | 4 |5 | 6 |
  6. | 1 | 2 | 2 | 2 |2 | 3 |
  7. | 0 | 0 | 1 | 2 |2 | 3 |
  8. 我想要掩码布尔数据,在每行中的1和前2个数字将为True
  9. 预期输出如下;
  10. |may | apr | mar |feb |jan |dec |
  11. | -- | ---- |----- |--- |--- |--- |
  12. | False | False | False | True |True | False|
  13. | True | True | False | False |False | False|
  14. | True | True | False | False |False |False |
  15. | False | False | True | True |False | False|
英文:

I have a data frame as follows;

  1. |may | apr | mar |feb|jan|dec|
  2. | -- | ----|-----|---|---|---|
  3. | 0 | 0 | 0 | 1 |2 | 3 |
  4. | 1 | 2 | 3 | 4 |5 | 6 |
  5. | 1 | 2 | 2 | 2 |2 | 3 |
  6. | 0 | 0 | 1 | 2 |2 | 3 |

I want mask Boolean data where I would have True for 1s and first 2 in each row

Expected output is as follows;

  1. |may | apr | mar |feb |jan |dec |
  2. | -- | ---- |----- |--- |--- |--- |
  3. | False | False | False | True |True | False|
  4. | True | True | False | False |False | False|
  5. | True | True | False | False |False |False |
  6. | False | False | True | True |False | False|

答案1

得分: 2

out = df.eq(1) | (df.eq(2) & (df.eq(2).cumsum(axis=1)==1))
Out[28]:
may apr mar feb jan dec
0 False False False True True False
1 True True False False False False
2 True True False False False False
3 False False True True False False

英文:

Check with two steps conditions combination

  1. out = df.eq(1) | (df.eq(2) & (df.eq(2).cumsum(axis=1)==1))
  2. Out[28]:
  3. may apr mar feb jan dec
  4. 0 False False False True True False
  5. 1 True True False False False False
  6. 2 True True False False False False
  7. 3 False False True True False False

答案2

得分: 1

另一个可能的解决方案:

  1. (df.T.eq(1) | df.T.ne(2).cummin().diff().fillna(False)).T

或者:

  1. (df.eq(1) | df.ne(2).cummin(axis=1).astype(int).diff(axis=1).fillna(0).astype(bool))

输出:

  1. 五月 四月 三月 二月 一月 十二月
  2. 0 False False False True True False
  3. 1 True True False False False False
  4. 2 True True False False False False
  5. 3 False False True True False False
英文:

Another possible solution:

  1. (df.T.eq(1) | df.T.ne(2).cummin().diff().fillna(False)).T

Or:

  1. (df.eq(1) | df.ne(2).cummin(axis=1).astype(int).diff(axis=1).fillna(0).astype(bool))

Output

  1. may apr mar feb jan dec
  2. 0 False False False True True False
  3. 1 True True False False False False
  4. 2 True True False False False False
  5. 3 False False True True False False

答案3

得分: 0

只使用布尔表达式。

英文:

Just use a boolean expression.

  1. import pandas as pd
  2. df = pd.DataFrame({"may": [1,2,3,4,5], "apr": [4,5,6,7,8], "mar": [9, 10, 11, 12, 13]})
  3. ndf = (df == 1) | (df == 2)

huangapple
  • 本文由 发表于 2023年4月11日 01:11:08
  • 转载请务必保留本文链接:https://go.coder-hub.com/75979131.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定