Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将第一个非零列值标记为1,其余0标记为多个列_Python_Pandas - Fatal编程技术网

Python 将第一个非零列值标记为1,其余0标记为多个列

Python 将第一个非零列值标记为1,其余0标记为多个列,python,pandas,Python,Pandas,请协助完成以下工作 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

请协助完成以下工作

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”集合,并基于“值”“标志”将1和其他值设为0

如果列中的值均为0,则所有值的标志均为0

如果列中的值都不为零,则第一个实例的标志为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 |
+----+-----+------+------+-------+------+

从一个简单的标志开始,确定是否设置了该值

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
在每个组中独立工作,您可以找到使用设置的第一个标志,后面跟着


使用
cummax
将第一个
1
条目之后的所有内容也转换为
1
,这样
diff
将全部
0
,除了从
0
1

的第一步之外,我们可以在这里使用
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

逻辑是什么?刚刚更新了问题,请协助thnx@Erfan一个小加法,如果“值”在GRP,ORG1,ORG2TNX@mcskinner的一组GRP,ORG1,ORG2TNX中有所有0,我需要FLAG=1至少为1行,如果“值”在GRP,ORG1的一组GRP中有所有0,Org2这听起来是一个很好的后续问题。例如,“当组的所有条目都为0时,如何将每个组的单行设置为1?”在这个问题上,您明确要求“如果列中的值都为0,那么FLAG=0表示所有”,我认为最好保持现状,因为您已经有了一些答案。
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