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