使用分配和作为参数传递的变量根据前一行更改列的值
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_time
和 flag
。
每一行的值为 visit_time
,前一行的值为 NaT
。知道这一点,我想在数据框中做下一个修改:
- 将具有非空值
visit_time
的行的标志设置为与其前一行相同的值。
使用的代码@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())})
让它成为以下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_time
和 flag
。
每一行的值为 visit_time
,前一行的值为 NaT
。知道这一点,我想在数据框中做下一个修改:
- 将具有非空值
visit_time
的行的标志设置为与其前一行相同的值。
使用的代码@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())})