给定特定条件,如何更改数据框列的值

时间:2020-10-08 10:41:56

标签: python pandas dataframe

在下表中,如果符合条件,我将尝试更改“值”列中的数字。

条件:如果标识符A_xcxcxcis的“日期” <'05 / 05/2021',则A_xcxcxc和DAB_bcbcbc(其下一行)的“值”都将更改为零,否则两个值将保持不变(两个行彼此链接)。

然后它将对BAB_bnbnb,CCC_eetr,D_tyty等执行相同的检查。我已经在下表中显示了预期的答案。

***必须对原始表格进行一些修改

新表格:

import pandas as pd
df = pd.DataFrame({'IDENTIFIER': ['A_xcxcxc', 'DAB_bcbcbc', 'BAB_bnbnb', 'XYZ_ererte', 'CCC_eetr', 'CZc_rgrg', 'D_tyty', 'sdD_wewerw', 'sdE_tyty', 'Esd_fhg'], 
                   'income': [-30362100.0, 200000.0, -21248077.5, 150000.0, -33843389.2, 200000.0, -40229279.75, 250000.0, -22111384.6, 200000.0],
'Date' : ['03/03/2021', '22/01/2060', '04/03/2021', '22/07/2068', '08/03/2021', '22/11/2065', '05/04/2021', '22/03/2052', '15/10/2025', '22/07/2065']
})

enter image description here

预期答案:

enter image description here

1 个答案:

答案 0 :(得分:2)

我想你想要

df.loc[pd.to_datetime(df['Date'], format='%d/%m/%Y')
         .groupby(df['IDENTIFIER'].str.split('_').str[0])
         .transform('first')
         .lt(pd.to_datetime('05/05/2021', format='%d/%m/%Y')), 'income'] = 0
print(df)

  IDENTIFIER      income        Date
0   A_xcxcxc         0.0  03/03/2021
1   A_bcbcbc         0.0  22/01/2060
2    B_bnbnb         0.0  04/03/2021
3   B_ererte         0.0  22/07/2068
4     C_eetr         0.0  08/03/2021
5     C_rgrg         0.0  22/11/2065
6     D_tyty         0.0  05/04/2021
7   D_wewerw         0.0  22/03/2052
8     E_tyty -22111384.6  15/10/2025
9      E_fhg    200000.0  22/07/2065

如果要每两行分组一次:

df.loc[pd.to_datetime(df['Date'], format='%d/%m/%Y')
         .groupby(np.arange(df.shape[0])//2)
         .transform('first')
         .lt(pd.to_datetime('05/05/2021', format='%d/%m/%Y')), 'income'] = 0
print(df)