使用分配和作为参数传递的变量根据前一行更改列的值

Change values of a column based on the previous row using assign and a variable passed as a parameter

让它成为以下Python熊猫数据框:

code visit_time flag other counter
0 NaT True X 3
0 1 days 03:00:12 False Y 1
0 NaT False X 3
0 0 days 05:00:00 True X 2
1 NaT False Z 3
1 NaT True X 3
1 1 days 03:00:12 False Y 1
2 NaT True X 3
2 5 days 10:01:12 True Y 0

要解决这个问题,只需要列:code, visit_timeflag

每一行的值为 visit_time,前一行的值为 NaT。知道这一点,我想在数据框中做下一个修改:

使用的代码@Cameron Riddell:

out = df.assign(
    flag=df['flag'].mask(df['visit_time'].notnull(), df['flag'].shift())
)

print(out)
   code      visit_time   flag other  counter
0     0             NaT   True     X        3
1     0 1 days 03:00:12   True     Y        1
2     0             NaT  False     X        3
3     0 0 days 05:00:00  False     X        2
4     1             NaT  False     Z        3
5     1             NaT   True     X        3
6     1 1 days 03:00:12   True     Y        1
7     2             NaT   True     X        3
8     2 5 days 10:01:12   True     Y        0

问题是我想在一个函数中重用代码,所以 flag 列将存储在一个变量中,比如 name。如果我使用以下代码,则会在 DataFrame 中创建一个新列 name

name = 'flag'
out = df.assign(
    name=df[name].mask(df['visit_time'].notnull(), df[name].shift())
)

我怎样才能获得相同的功能,但能够修改参数传递的列的值?

您可以使用 ** 将字典解压到关键字参数中:

name = 'flag'
out = df.assign(**{name: df[name].mask(df['visit_time'].notnull(), df[name].shift())})