我正在尝试根据其他列的行中的值更改在新列中分配值。请参考给定的数据集。

ID1是基于diff列的,每当值不等于1时,它都应将新ID分配给上一行中的ID。

ID2-当区域在ID1内更改时分配ID

ID3-在ID1和ID2中分配ID

当Indv列更改为新值时,以上所有三个ID均应从1开始。



import pandas as pd

# intialise data of lists.
data={'Indv':[1,1,1,1,1,1,1,1,1,1,1,2,2,2],
'Region':['A','A','A','A','B','B','B','C','C','C','D','A','A','C'],
'diff':[ 1,1,10,1,1,1,1,10,1,1,1,-11,1,1],
}

#CreateDataFrame
df=pd.DataFrame(data)

#creating ID1
df['ID1']=1

#Code only for ID1
for i in range(len(df)):
    j=i+1
    if(df['Indv'][i]!=df['Indv'][j]):
        df['session_ID'][j]=1
        if df['diff'][j]==1:
            df['ID1'][j]=df['ID1'][i]
        else:
            df['ID1'][j]=df['ID1'][i]+1
    break;



具有预期结果的数据集-需要生成ID1,ID2和ID3列。

Indv, Region, diff, ID1, ID2, ID3
1, A, 1, 1, 1, 1
1, A, 1, 1, 1, 2
1, A, 10, 2, 1, 1
1, A, 1, 2, 1, 2
1, B, 1, 2, 2, 1
1, B, 1, 2, 2, 2
1, B, 1, 2, 2, 3
1, C, 10, 3, 1, 1
1, C, 1, 3, 1, 2
1, C, 1, 3, 1, 3
1, D, 1, 3, 2, 1
2, A, -11, 1, 1, 1
2, A, 1, 1, 1, 2
2, C, 1, 1, 2, 1

最佳答案

这是我的解决方案:


创建数据框


data={'Indv':[1,1,1,1,1,1,1,1,1,1,1,2,2,2],
'Region1':['A','A','A','A','B','B','B','C','C','C','D','A','A','C'],
'diff':[ 1,1,10,1,1,1,1,10,1,1,1,-11,1,1]
}
df = pd.DataFrame(data)



声明用于查找id1和id2的函数:


def createId1(group):
    cumsum = group.ne(1).cumsum()
    if cumsum.iloc[0] == 0:
        return cumsum + 1
    return cumsum

def createId2(group):
    return group.ne(group.shift(1)).cumsum()



创建id列


df["id1"] = df.groupby(["Indv"])["diff"].transform(lambda group: createId1(group))
df["id2"] = df.groupby(["Indv", "id1"])["Region1"].transform(lambda group: createId2(group))
df["id3"] = df.groupby(["Indv", "id1", "id2"]).cumcount()+1


输出:

print(df.to_string())

    Indv Region1  diff  id1  id2  id3
0      1       A     1    1    1    1
1      1       A     1    1    1    2
2      1       A    10    2    1    1
3      1       A     1    2    1    2
4      1       B     1    2    2    1
5      1       B     1    2    2    2
6      1       B     1    2    2    3
7      1       C    10    3    1    1
8      1       C     1    3    1    2
9      1       C     1    3    1    3
10     1       D     1    3    2    1
11     2       A   -11    1    1    1
12     2       A     1    1    1    2
13     2       C     1    1    2    1



  说明文件:
  
  DataFrame.groupby:根据一个映射器对行进行分组(在这里我使用了一个或多个序列)。
  
  GrouBy.transform:在每个组上应用一个功能(GroupBy.apply也会起作用)。
  
  Series.ne:基于值的非相等元素明智地返回一系列布尔值。
  
  Series.shift:将序列的索引移动给定步骤。
  
  DataFrame.cumsum:返回系列的累计和。当应用于布尔系列时,返回遇到的True值的累积和。
  
  GroupBy.cumcount:对从0开始的组中的每个项目编号。

关于python - 根据多个IF条件使用新ID创建列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57586002/

10-12 20:12