【问题标题】:How to change a value in a dataframe using multiple conditions with loc?如何使用 loc 的多个条件更改数据框中的值?
【发布时间】:2020-12-04 09:23:59
【问题描述】:

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

在区间内,当找到一个不等于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

但以上几行都不起作用。

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

【问题讨论】:

    标签: python pandas dataframe time-series assign


    【解决方案1】:

    您最后尝试的三行是 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 将使用布尔掩码选择您想要的行。

    编辑

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

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

    或者让你的面具保持原样并结合.loc中的条件

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

    【讨论】:

    • 我试过这些,但他们把值 2 放在整个列上,我想只在 1 的地方有它。在这种情况下应该如何修改?
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多