在Pandas中使用iterrows()和算术

时间:2017-04-28 21:09:23

标签: python pandas

在C中索引数组非常简单,括号可以很好地处理算术,因此可以比较相邻的值。这就是我想在Pandas中使用iterrows()做的事情,但我找不到一个合适的例子来说明如何做到这一点。请考虑以下事项:

         Year   Name        Winner  Count
432     1936    Alice       0.0      2
538     1937    Alice       1.0      2
6391    1985    Bob         1.0      2
6818    1989    Brad        0.0      2

爱丽丝在1936年没有获奖,但她在1937年赢了一个。我需要迭代所有的行,1)检查行n中的年份是否紧跟在行n - 1的年份之后,2)如果是的话,主题是否在第二年赢得而不是第一年?爱丽丝符合要求,我想在框架中打印出她的名字和符合标准的其他人。

我开始了。 。 。

for index, row in df.iterrows():
    if df['Year'] > df[df.Year - 1]:

除其他外,我得到的显式转换为int(即Year)的数据类型现在作为字符串返回。有没有办法做到这一点,还是应该探索不同的方法?

1 个答案:

答案 0 :(得分:1)

以下是一些增强的样本数据,以说明边缘情况:

         Year   Name        Winner  Count
432     1936    Alice       0.0      2
538     1937    Alice       1.0      2
6390    1985    Bob         1.0      2
6817    1989    Brad        0.0      2
433     1997    Alice       0.0      2
539     1993    Alice       1.0      2
6391    1986    Bob         1.0      2
6818    1990    Brad        0.0      2
6819    1991    Brad        0.0      2

此方法按NameYear对行进行排序,然后确定某一年是否符合纳入标准(即,与前一年相同,并获胜)。 然后,一个简单的groupby()找到符合条件的科目。

import pandas as pd

df = pd.read_clipboard()
df.sort_values(['Name','Year'], inplace=True)

# eligible = consecutive year and won in that year
df['eligible'] = (df.Year.subtract(df.Year.shift()) == 1.) & (df.Winner)

# identify any person with at least one eligible year
df.groupby('Name').eligible.any())

输出:

Name
Alice     True
Bob       True
Brad     False