Пометить первое ненулевое значение столбца 1 и остаток 0, имеющий несколько столбцов - PullRequest
0 голосов
/ 19 апреля 2020

Пожалуйста, помогите с приведенным ниже

import pandas as pd
df = pd.DataFrame({'Grp': [1,1,1,1,2,2,2,2,3,3,3,4,4,4], 'Org1': ['x','x','y','y','z','y','z','z','x','y','y','z','x','x'], 'Org2': ['a','a','b','b','c','b','c','c','a','b','b','c','a','a'], 'Value': [0,0,3,1,0,1,0,5,0,0,0,1,1,1]})
df

*** Мне нужно первое ненулевое значение, имеющее "FLAG" = 1 и другие 0

Детали:

Для каждого уникального набора «Grp, Org1, Org2» и на основе «Значения» «FLAG» должен иметь 1, а остальные - 0.

Если все значения в столбце равны 0, тогда FLAG = 0 для все

Если в столбце все значения равны NON ZERO, то первый экземпляр имеет FLAG = 1 и другие 0

Я ожидаю вывод, как показано ниже

+----+-----+------+------+-------+------+
|    | Grp | Org1 | Org2 | Value | FLAG |
+----+-----+------+------+-------+------+
|  0 |   1 | x    | a    |     0 |    0 |
|  1 |   1 | x    | a    |     0 |    0 |
|  2 |   1 | y    | b    |     3 |    1 |
|  3 |   1 | y    | b    |     1 |    0 |
|  4 |   2 | z    | c    |     0 |    0 |
|  5 |   2 | y    | b    |     1 |    1 |
|  6 |   2 | z    | c    |     0 |    0 |
|  7 |   2 | z    | c    |     5 |    1 |
|  8 |   3 | x    | a    |     0 |    0 |
|  9 |   3 | y    | b    |     0 |    0 |
| 10 |   3 | y    | b    |     0 |    0 |
| 11 |   4 | z    | c    |     1 |    1 |
| 12 |   4 | x    | a    |     1 |    1 |
| 13 |   4 | x    | a    |     1 |    0 |
+----+-----+------+------+-------+------+

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Мы можем использовать GroupBy.idxmax здесь:

m = df['Value'].ne(0)
idx = df['Value'].where(m).groupby([df['Grp'], df['Org1']]).idxmax()
df['FLAG'] = df.index.isin(idx).astype(int)

    Grp Org1 Org2  Value  FLAG
0     1    x    a      0     0
1     1    x    a      0     0
2     1    y    b      3     1
3     1    y    b      1     0
4     2    z    c      0     0
5     2    y    b      1     1
6     2    z    c      0     0
7     2    z    c      5     1
8     3    x    a      0     0
9     3    y    b      0     0
10    3    y    b      0     0
11    4    z    c      1     1
12    4    x    a      1     1
13    4    x    a      1     0
1 голос
/ 19 апреля 2020

Начните с простого флага, чтобы определить, установлено ли значение.

df = df.assign(FLAG=df.Value.where(df.Value == 0, 1))
df
#     Grp Org1 Org2  Value  FLAG
# 0     1    x    a      0     0
# 1     1    x    a      0     0
# 2     1    y    b      3     1
# 3     1    y    b      1     1
# 4     2    z    c      0     0
# 5     2    y    b      1     1
# 6     2    z    c      0     0
# 7     2    z    c      5     1
# 8     3    x    a      0     0
# 9     3    y    b      0     0
# 10    3    y    b      0     0
# 11    4    z    c      1     1
# 12    4    x    a      1     1
# 13    4    x    a      1     1

Затем, используя groupby для независимой работы с группой, вы можете найти первый флаг, который был установлен с помощью pd.Series.cummax , за которым следует pd.Series.diff .

flag = df.groupby(['Grp', 'Org1', 'Org2'])['FLAG'].transform(lambda x: x.cummax().diff())                                                                                                                                                    
df['FLAG'] = flag.where(flag.notnull(), df['FLAG']).astype(int)
df
#     Grp Org1 Org2  Value  FLAG
# 0     1    x    a      0     0
# 1     1    x    a      0     0
# 2     1    y    b      3     1
# 3     1    y    b      1     0
# 4     2    z    c      0     0
# 5     2    y    b      1     1
# 6     2    z    c      0     0
# 7     2    z    c      5     1
# 8     3    x    a      0     0
# 9     3    y    b      0     0
# 10    3    y    b      0     0
# 11    4    z    c      1     1
# 12    4    x    a      1     1
# 13    4    x    a      1     0

Использование cummax преобразует все после первой записи 1 в 1 также, так что diff будет всем 0 за исключением первого шага от 0 до 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...