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

问题描述

我想从数据帧的行/列中更改值,如下所示:

在时间间隔内,如果发现一个等于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。

我也尝试过......

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

但以上所有行均无效。

请帮助我。 :(非常感谢您的帮助!

解决方法

最后您尝试的三行是pandas所说的“链式定位调用”,如果您要使用它们分配新值,每次都会失败。一个.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将使用布尔掩码选择所需的行。

编辑

您可以在面具中加入第三种条件

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

或者保留您的面具,并合并.loc内的条件

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

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

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

当val为 1 时,您想要增加val值。然后,您只需执行以下操作即可:

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