如何使用 loc 的多个条件更改数据框中的值?

How to change a value in a dataframe using multiple conditions with loc?

我想更改数据框 row/column 的值,如下所示:

在区间内,当它找到一个不等于1的值时,那么它应该放2。

例子:

初始df:

index                      event
2019-12-07 18:30:16         0
2019-12-07 19:30:16         0           
2019-12-07 20:30:16         0           
2019-12-07 21:30:16         0           
2019-12-07 22:30:16         1

求df:

index                      event
2019-12-07 18:30:16         0
2019-12-07 19:30:16         0           
2019-12-07 20:30:16         0           
2019-12-07 21:30:16         0           
2019-12-07 22:30:16         2

以下代码有效,但我无法更改值:

mask = (df.index > start_dates) & (df.index <= end_dates)

for k in range (0, len(df.loc[mask])):
    if df.loc[mask].event[k] == 1:
        df.loc[mask].loc[df.loc[mask].event == 1, "event"] = 2

我无法在最后一行代码中将值从 1 更改为 2。

我也试过这个...:[=​​14=]

df.loc[mask].loc[df.loc[mask].event == 1, "event"] = 2
df.loc[mask].event[df.loc[mask].event == '1'] = 2
df.loc[mask].event[k] = 2

但是上面的 none 行有效。

请帮助我。 :( 非常感谢任何帮助!

也许你想试试这个: 假设你有一个像这样的数据框 :

df = pd.DataFrame(data={"index":[1,2,3,4], "val":[0,0,1,0],"event":[0,0,0,0]})

而你想要增加 val 值,当 val 为 1 时。然后你只需要做:

df.loc[df['val'] == 1, 'val'] = 2

您最后尝试的三行是 pandas 所谓的“链式 loc 调用”,如果您想使用它们来分配新值,每次都会失败。一个.loc就够了

df.loc[mask] = 2
 # or
df.loc[mask, :] = 2
# both will assign two to all columns if you have more

# or also
df.loc[mask, 'event'] = 2

不需要循环,.loc 将 select 带有布尔掩码的行。

编辑

您可以在掩码中包含第三个条件

mask = (df.index > start_dates) & (df.index <= end_dates) & (df.event ==1)

或者你的面具保持原样,结合里面的条件.loc

df.loc[mask & (df.event ==1), 'event'] = 2