为了账号安全,请及时绑定邮箱和手机立即绑定

想先创建一个计数器。最后。在 Python 中等效

想先创建一个计数器。最后。在 Python 中等效

茅侃侃 2021-06-04 15:17:47
我有一个排序的熊猫数据框,如下所示: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=1for 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+1print df_pandas
查看完整描述

2 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

我所做的是将 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

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


查看完整回答
反对 回复 2021-06-06
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

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


查看完整回答
反对 回复 2021-06-06
  • 2 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号