数据帧迭代以比较没有for循环的行

时间:2017-04-28 11:58:50

标签: python pandas dataframe vectorization

我试图比较年度GDP值,以找出数据中的衰退。

    GDP in billions of current dollars  GDP in billions of chained 2009 dollars
Quarterly (Seasonally adjusted annual rates)        
1947q1  243.1   1934.5
1947q2  246.3   1932.3
1947q3  250.1   1930.3
1947q4  260.3   1960.7
1948q1  266.2   1989.5

这是我的数据的.head()。我比较了数十亿美元的2009年美国国内生产总值和国内生产总值的行数。找到负增长的季度

目前我已经遍历该列并创建了一个列表以便稍后追加。我意识到这可能是一个糟糕的方法,我想知道是否有人可以帮助我改进我的代码:

mask = []
for i in range(0,len(df)):
    try:
        if df.ix[i,2] > df.ix[i-1,2] : mask.append('False')
        else : mask.append('True')
    except:
        mask.append('False')
        continue

代码在条目1中存在问题,因为它没有任何内容可以与它(因此是守护代码)进行比较,因为我们可以告诉它开始“假”'

我可以将列表附加到数据框并继续,但我现在正在学习Pandas并希望在可能的情况下使用矢量化正确地执行此操作

1 个答案:

答案 0 :(得分:2)

IIUC您可以使用矢量化Series.diff()方法:

In [86]: df.iloc[:, 2].diff().lt(0)
Out[86]:
0    False
1     True
2     True
3    False
4    False
Name: c, dtype: bool

如果您需要Vanilla Python列表:

In [93]: df.iloc[:, 2].diff().lt(0).tolist()
Out[93]: [False, True, True, False, False]

来源DF:

In [87]: df
Out[87]:
        a      b       c
0  1947q1  243.1  1934.5
1  1947q2  246.3  1932.3
2  1947q3  250.1  1930.3
3  1947q4  260.3  1960.7
4  1948q1  266.2  1989.5

In [88]: df['c'].diff()
Out[88]:
0     NaN
1    -2.2
2    -2.0
3    30.4
4    28.8
Name: c, dtype: float64