我有一个排序的熊猫数据框,如下所示:
ID Values
'AAAA' 1
'AAAA' 2
'AAAA' 3
'BBBB' 4
'CCCC' 5
'CCCC' 6
我必须创建一个新的"ID_Index"
列
ID Values ID_Index
'AAAA' 1 1
'AAAA' 2 1
'AAAA' 3 1
'BBBB' 4 2
'CCCC' 5 3
'CCCC' 6 3
这意味着代码将检查第1行的ID,它将开始计数为1。然后,每当有新的ID时,计数器将为+1。
在SAS中,我们曾经使用first.id
和/或last.id
来做到这一点。在这里,我发现使用shift()可以创建它。我在python中尝试了以下代码,但无法正常工作。
c=1
for index, row in df_pandas.iterrows():
if (df_pandas['ID'] == df_pandas['ID'].shift()):
df_pandas['ID_Index']=c
else:
df_pandas['ID_Index'] = c+1
print df_pandas
答案 0 :(得分:1)
如果需要相同的值,我认为需要factorize
:
df['new'] = pd.factorize(df['ID'])[0] + 1
或者如果可能的话还有多个组:
df['new'] = df['ID'].ne(df['ID'].shift()).cumsum()
print (df)
ID Values new
0 'AAAA' 1 1
1 'AAAA' 2 1
2 'AAAA' 3 1
3 'BBBB' 4 2
4 'CCCC' 5 3
5 'CCCC' 6 3
最好在添加的新行中看到差异:
df['new1'] = pd.factorize(df['ID'])[0] + 1
df['new2'] = df['ID'].ne(df['ID'].shift()).cumsum()
print (df)
ID Values new1 new2
0 'AAAA' 1 1 1
1 'AAAA' 2 1 1
2 'AAAA' 3 1 1
3 'BBBB' 4 2 2
4 'CCCC' 5 3 3
5 'CCCC' 6 3 3
6 'AAAA' 7 1 4
答案 1 :(得分:1)
我要做的是将ID列转换为列表,手动创建ID_Index,然后将其附加到数据框
ids=df_pandas['ID'].tolist()
counter=1
id_index=[1]
for idx,id in enumerate(ids):
if idx!=0:
if ids[idx-1]!=id:
counter+=1
id_index.append(counter)
df_pandas['ID_Index']=id_index
确保这可能不是完美的方法,但可以完成工作