Python 基于多个IF条件使用新ID创建列
我试图根据其他列行中的值更改在新列中分配值。请参考给定的数据集 ID1-基于diff列,只要值不等于1,它就应该为上行中的ID分配一个新ID ID2-当ID1内的区域更改时分配ID ID3-在ID1和ID2中分配ID 当Indv列更改为新值时,上述三个ID都应从1开始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’]
作为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列。
这是我的解决方案:
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