首页 > 解决方案 > 根据条件编辑 DataFrame 的行值

问题描述

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

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

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

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 的行,而不是更多。输出:

   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

我希望输出看起来像:

    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

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

标签: pythonpandas

解决方案


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

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

推荐阅读