如何解决Pandas-循环控制-根据列值比较控制循环的行为
假设我有一个如下所示的Pandas DataFrame:
Row | Column1 | Column2 | Column3
0 | abc | 10 | NY
1 | abc | 20 | NY
2 | abc | 15 | CA
3 | xyz | 10 | RI
4 | xyz | 30 | NV
5 | lmn | 15 | MN
现在,我想对column2和column3的值执行多项操作,但是仅当column1的值更改时。也就是说,循环应贯穿前三行,并在值更改时激活不同的代码。传统语言中这样的内容:
prev = df[0:1]
for row in df:
if prev.column1 == row.column1:
<some code>
continue
else:
<some other code>
prev = row
目前,我尝试过的上述代码的python等效项对我不起作用,因为它表示该系列的真值不明确。如果我通过在条件上使用.any()
来解决此问题,那么对于column1值的第一次更改,它可以正常工作,但是会抛出异常; bool没有属性“ any”。
谢谢您的帮助。
解决方法
- 您可以使用
.shift()
逐行比较列中的值。 - 您可以使用
np.where()
来根据条件和操作来更改数据。
首先,我们使用以下条件创建条件:
condition = (df.shift()['Column1'] != df['Column1']) & df.index > 0
- 如果
True
中的值与带有False
的上一行Column1
值不同,则此条件将行标记为Column1
或(df.shift()['Column1'] != df['Column1'])
。 li>
- 但是,这也会标记第一行,因此您可以添加
df.index > 0
作为忽略第一行的另一条件。
接下来,让我们根据条件对数据框进行一些操作:
df['Column2'] = np.where(condition,df['Column2'] + 100,df['Column2'])
df['Column3'] = np.where(condition,df['Column3'] + ' (adjusted)',df['Column3'])
-
使用
np.where()
,您传递的第一个参数是您刚创建的自定义condition
变量。 -
如果第一个参数(
condition
)为True
,则要传递的第二个参数是您想执行的任何操作。例如,df['Column2'] + 100
或df['Column3'] + ' (adjusted)'
-
您将传递的第三个参数是
来返回列的原始值condition
为False
时应返回的内容。在这种情况下,只需使用df['Column2']
或df['Column3']
import pandas as pd,numpy as np
condition = (df.shift()['Column1'] != df['Column1']) & df.index > 0
df['Column2'] = np.where(condition,df['Column2'])
df['Column3'] = np.where(condition,df['Column3'])
df
Out[22]:
Row Column1 Column2 Column3
0 0 abc 10 NY
1 1 abc 20 NY
2 2 abc 15 CA
3 3 xyz 110 RI (adjusted)
4 4 xyz 30 NV
5 5 lmn 115 MN (adjusted)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。