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

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

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

问题

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

我有一个数据框如下;

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

我想要掩码布尔数据,在每行中的1和前2个数字将为True

预期输出如下;

    |may     | apr   | mar    |feb    |jan   |dec   |
    | --     | ----  |-----   |---    |---   |---   |
    | False  | False |  False | True  |True  | False|
    | True   | True  |  False | False |False | False|
    | True   | True  |  False | False |False |False |
    | False  | False | True   | True  |False | False|
英文:

I have a data frame as follows;

|may | apr | mar |feb|jan|dec|
| -- | ----|-----|---|---|---|
| 0  | 0   |  0  | 1 |2  | 3 |
| 1  | 2   |  3  | 4 |5  | 6 |
| 1  | 2   |  2  | 2 |2  | 3 |
| 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;

|may     | apr   | mar    |feb    |jan   |dec   |
| --     | ----  |-----   |---    |---   |---   |
| False  | False |  False | True  |True  | False|
| True   | True  |  False | False |False | False|
| True   | True  |  False | False |False |False |
| 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

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

答案2

得分: 1

另一个可能的解决方案:

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

或者:

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

输出:

         五月    四月    三月    二月    一月    十二月
    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
英文:

Another possible solution:

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

Or:

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

Output

     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

答案3

得分: 0

只使用布尔表达式。

英文:

Just use a boolean expression.

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

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:

确定