首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于条件编辑DataFrame的行值

基于条件编辑DataFrame的行值
EN

Stack Overflow用户
提问于 2021-02-03 04:57:09
回答 1查看 41关注 0票数 0

我有一个DataFrame,并希望根据条件编辑行的值。DataFrame如下所示:

代码语言:javascript
复制
ID      ABCD_ID STATUS
83590   IX1655  APPROVAL_A
83590   IX1655  FINAL-APPROVAL_A
82042   IX1656  APPROVAL_A
82042   IX1656  FINAL-APPROVAL
77848   IX1666  APPROVAL_M
77848   IX1666  FINAL-APPROVAL_A
77848   IX1667  APPROVAL_A
77848   IX1667  FINAL-APPROVAL_A

我想根据IDABCD_ID的值将"DOC" + 1,2,3等添加到列STATUS。我应用的逻辑是:

代码语言:javascript
复制
a = 1
for i in range (len(df)-1):
    if df.ID.iloc[i] == df.ID.iloc[i+1] and df.ABCD_ID.iloc[i]== df.ABCD_ID.iloc[i+1]:
        df.STATUS.iloc[i] = 'DOC_'+ str(a) + '_'+df.STATUS.iloc[i]
        df.STATUS.iloc[i+1] = 'DOC_'+ str(a) + '_'+df.STATUS.iloc[i+1]
    elif  df.ID.iloc[i] == df.ID.iloc[i+1] and df.ABCD_ID.iloc[i]!= df.ABCD_ID.iloc[i+1]:
        df.STATUS.iloc[i+1] = 'DOC_'+ str(a+1) + '_'+df.STATUS.iloc[i+1]

该逻辑仅适用于具有两个相同IDS的行,而不适用于更多IDS。输出:

代码语言:javascript
复制
   ID     ABCD_ID                 STATUS
0  83590  IX1655        DOC_1_APPROVAL_A
1  83590  IX1655  DOC_1_FINAL-APPROVAL_A
2  82042  IX1656        DOC_1_APPROVAL_A
3  82042  IX1656    DOC_1_FINAL-APPROVAL
4  77848  IX1666        DOC_1_APPROVAL_M
5  77848  IX1666  DOC_1_FINAL-APPROVAL_A
6  77848  IX1667  DOC_1_DOC_2_APPROVAL_A
7  77848  IX1667  DOC_1_FINAL-APPROVAL_A

我希望输出如下所示:

代码语言:javascript
复制
    ID    ABCD_ID                 STATUS
0  83590  IX1655        DOC_1_APPROVAL_A
1  83590  IX1655  DOC_1_FINAL-APPROVAL_A
2  82042  IX1656        DOC_1_APPROVAL_A
3  82042  IX1656    DOC_1_FINAL-APPROVAL
4  77848  IX1666        DOC_1_APPROVAL_M
5  77848  IX1666  DOC_1_FINAL-APPROVAL_A
6  77848  IX1667  DOC_2_APPROVAL_A
7  77848  IX1667  DOC_2_FINAL-APPROVAL_A

也许有更简单的方法来解决这个问题?如有任何建议,我们将不胜感激

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-03 13:03:22

一种完全不同的方法是向删除了重复行的临时数据框的列添加每个ID的累积计数。将其与原始数据框组合以填充缺少的行。将它连接到列中,就完成了。如果你有大量的数据,这比循环处理更有优势。

代码语言:javascript
复制
tmp = df[['ID','ABCD_ID']].drop_duplicates()
flg = tmp.groupby(['ID']).cumcount()+1
df = pd.concat([df, flg], axis=1)
df[0].fillna(method='ffill', inplace=True)
df[0] = df[0].astype(int)
df['STATUS'] = 'DOC_' + df[0].astype(str) + '_' + df['STATUS']
df

    ID  ABCD_ID     STATUS  0
0   83590   IX1655  DOC_1_APPROVAL_A    1
1   83590   IX1655  DOC_1_FINAL-APPROVAL_A  1
2   82042   IX1656  DOC_1_APPROVAL_A    1
3   82042   IX1656  DOC_1_FINAL-APPROVAL    1
4   77848   IX1666  DOC_1_APPROVAL_M    1
5   77848   IX1666  DOC_1_FINAL-APPROVAL_A  1
6   77848   IX1667  DOC_2_APPROVAL_A    2
7   77848   IX1667  DOC_2_FINAL-APPROVAL_A  2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66017521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档