想要先使用创建一个计数器。最后。等价于Python

时间:2018-08-29 12:49:00

标签: python pandas

我有一个排序的熊猫数据框,如下所示:

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

2 个答案:

答案 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

确保这可能不是完美的方法,但可以完成工作