【问题标题】:Dataframe iteration to compare rows without for loop数据框迭代以比较没有 for 循环的行
【发布时间】:2017-04-28 20:09:49
【问题描述】:

我正在尝试比较年度 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 存在问题,因为它没有任何东西可以与它(因此是监护人代码)进行比较,因为我们可以告诉它以“假”开始,所以不必担心

我可以将列表附加到数据框并继续,但我目前正在学习 Pandas,并且希望尽可能使用矢量化来正确地做到这一点

【问题讨论】:

    标签: python pandas dataframe vectorization


    【解决方案1】:

    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
    

    【讨论】:

    • 效果很好,谢谢。我不太确定 .lt(0) 的作用 - 将负值标记为 True,将正值标记为 False?
    • @LeonKyriacou,很高兴我能帮上忙 :-)
    • @MaxU - 非常好的矢量化解决方案 ;)
    猜你喜欢
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 2022-11-18
    • 2012-11-28
    相关资源
    最近更新 更多