如何使用 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
我想更改数据框 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