Python 基于多个IF条件使用新ID创建列

Python 基于多个IF条件使用新ID创建列,python,pandas,dataframe,lambda,conditional-statements,Python,Pandas,Dataframe,Lambda,Conditional Statements,我试图根据其他列行中的值更改在新列中分配值。请参考给定的数据集 ID1-基于diff列,只要值不等于1,它就应该为上行中的ID分配一个新ID ID2-当ID1内的区域更改时分配ID ID3-在ID1和ID2中分配ID 当Indv列更改为新值时,上述三个ID都应从1开始 作为pd进口熊猫 #对列表数据进行初始化。 数据={'Indv':[1,1,1,1,1,1,1,1,1,1,1,1,2,2], ‘区域’:[‘A’、‘A’、‘A’、‘B’、‘B’、‘C’、‘C’、‘D’、‘A’、‘A’、‘C’]

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

ID1-基于diff列,只要值不等于1,它就应该为上行中的ID分配一个新ID

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

ID3-在ID1和ID2中分配ID

当Indv列更改为新值时,上述三个ID都应从1开始


作为pd进口熊猫
#对列表数据进行初始化。
数据={'Indv':[1,1,1,1,1,1,1,1,1,1,1,1,2,2],
‘区域’:[‘A’、‘A’、‘A’、‘B’、‘B’、‘C’、‘C’、‘D’、‘A’、‘A’、‘C’],
‘diff’:[1,1,10,1,1,1,1,10,1,1,1,1,-11,1,1],
}
#CreateDataFrame
df=pd.DataFrame(数据)
#创建ID1
df['ID1']=1
#代码仅适用于ID1
对于范围内的i(len(df)):
j=i+1
如果(df['Indv'][i]!=df['Indv'][j]):
df['session_ID'][j]=1
如果df['diff'][j]==1:
df['ID1'][j]=df['ID1'][i]
其他:
df['ID1'][j]=df['ID1'][i]+1
打破
具有预期结果的数据集-需要生成ID1、ID2和ID3列。 这是我的解决方案:

  • 创建数据帧
  • 声明用于查找id1和id2的函数:
  • 创建id列
  • 输出:

    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
    
    文件:

    :基于映射器对行进行分组(这里我使用了一个或多个系列)

    :对每个组应用一个函数(也会起作用)

    :基于值的非相等元素返回一系列布尔值

    :按给定的步长移动序列的索引

    :返回序列的累积和。应用于布尔级数时,返回遇到的真值的累积和

    :从0开始对组中的每个项目进行编号


    你能创造吗?因为在输入数据中缺少ID,在输出数据中也只更改了ID2(如果输入也是ID1、ID2、ID3)。我在代码中做了一些更改,并且我的输入数据集只有三列:个体(Indv)、区域(Region)和差异(diff)。我正在尝试生成ID1、ID2和ID3列。这些列基于个人和地区的变化。@SrikanthAyithy:不客气,我添加了我使用的每个函数的文档,以便您在不清楚的情况下理解每个步骤:)
    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)
    
    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()
    
    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