python - 数据帧迭代以比较行而无需 for 循环

标签 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 年 GDP(以数十亿美元为单位)”的行,以查找出现负增长的季度

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

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 存在问题,因为它没有任何内容可以与之比较(因此是监护人代码)作为开始,这并不是什么大问题,因为我们可以告诉它以“False”开始

我可以将列表附加到数据帧并继续,但我目前正在学习 Pandas,如果可能的话,希望使用矢量化正确地完成此操作

最佳答案

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

关于python - 数据帧迭代以比较行而无需 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43679703/

相关文章:

使用 PyTables 和 HDF5 进行 Python 单元测试

python - 如何使用 django 在 Mysql 数据库中存储文件路径?

python - 为什么循环在这里胜过索引?

python - pandas 将列添加到列底部

r - 在 R 中计算多个数据帧的 z 分数

python - 重新索引缺少类别的多级索引

python - 想要根据条件连接两个数据框的最后一行

python - 仅在 PyCharm 中发生的异常

python-3.x - python : How to find nth minimum value from a dataframe column?

python - Pandas 数据框fillna()只有一些列到位