【问题标题】:Pandas .diff() on specific rowsPandas .diff() 在特定行上
【发布时间】:2020-06-20 02:31:18
【问题描述】:

我见过很多类似的问题,但没有一个能解决我的问题。

我有一个非常大的数据集,我想在其中找到与前一行中选定的几行的差异。在 fol 示例中,我想根据 calc 中的值获取 pVal 上的 diff(),如图所示:

     pVal        calc        pDiff
1    .17         False       NaN
2    .31         False       NaN
3    .46         False       NaN
4    .39         True       -.07
5    .26         False       NaN
6    .6          True       .34

注意:pDiff 默认获取 NaN

可以简单地计算所有行的差异,然后在“calc”下将 pDiff 替换为 NaN 反对 False。但如前所述,我有一个非常大的数据集,在 calc 列中只有很少的“真”值,所以开销很大。

我尝试了以下方法:

df['pDiff'] = df[df['calc']==True]['pVal'].diff()

但它给出了不正确的结果,计算了 calc==True 的行之间的差异。在我们的示例中,第 6 行的差异在第 6 行和第 4 行之间计算 (0.6 - 0.39 = 0.21),而不是在第 6 行和第 5 行之间计算出预期的 0.34。第 4 行的差异仍然是 NaN 是 calc==True 的第一行。

我可以选择遍历所有行,但这对我来说太慢了。

我需要一个解决方案,仅计算和更改 calc 包含 True 的那些行的值。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    np.where + shift 非常适合根据条件进行上一行或下一行比较:)

    df['pDiff'] = np.where((df['calc'] == True), df['pVal'] - df['pVal'].shift(), np.nan)
    

    【讨论】:

      【解决方案2】:

      运行:df['pDiff'] = np.where(df.calc, df.pVal.diff(), np.nan)

      df.pVal.diff() 是数据源,np.where 充当过滤器。 df.calc 是条件,np.nan 是“其他”值。

      【讨论】:

        【解决方案3】:

        试试,

        df['shifted'] = df.calc.shift()
        df1 = df[(df.calc == True) | (df.shifted == True)]
        df1.pdidff = df1.pVal.diff()
        

        【讨论】:

          猜你喜欢
          • 2020-09-06
          • 2010-10-18
          • 1970-01-01
          • 2018-03-02
          • 2014-05-06
          • 2018-07-15
          • 2015-07-08
          • 2019-01-04
          • 2017-05-11
          相关资源
          最近更新 更多