【问题标题】:Calculating the difference between the first non-na value and the last na-value based on a grouped condition根据分组条件计算第一个非 na 值和最后一个 na 值之间的差异
【发布时间】:2022-11-30 19:25:26
【问题描述】:

我正在寻找计算以下数据集的第一个和最后一个非 na 值之间的百分比增加或减少:

Year Company Data
2019 X 341976.00
2020 X 1.000
2021 X 282872.00
2019 Y NaN
2020 Y NaN
2021 Y NaN
2019 Z 4394.00
2020 Z 173.70
2021 Z 518478.00

因为我想要相对变化,所以我希望公式能做类似的事情:

(last non-na value)/(first non-na value)-1

这应该返回如下内容:

Year Company Data Data
2019 X 341976.00 NaN
2020 X 1.000 NaN
2021 X 282872.00 -0.17
2019 Y NaN NaN
2020 Y NaN NaN
2021 Y NaN NaN
2019 Z 4394.00 NaN
2020 Z 173.70 NaN
2021 Z 518478.00 11.700

我曾尝试将基于公司字段的 groupby 与 first_valid_index 结合使用,但还没有找到解决方案。计算上述相对变化的最有效方法是什么?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    要找到第一个非 na 值,您可以:

    • 从列的第一个元素到最后一个元素迭代,如果你的值不是np.nan,则中断,
    • 在数据帧上使用.dropna 方法并从结果 df 中获取第一个元素。

    最后找到:

    • 从最后一个迭代到第一个(就像上面一样),
    • 使用dropna 并从最后一行获取值

    【讨论】:

      【解决方案2】:

      利用:

      s = df.groupby('Company')['Data'].agg(['last','first']).eval('last / first').sub(1)
      
      idx = df.dropna(subset=['Data']).drop_duplicates(['Company'], keep='last').index
      
      df.loc[idx, 'Date'] = df.loc[idx, 'Company'].map(s)
      print (df)
      
         Year Company      Data        Date
      0  2019       X  341976.0         NaN
      1  2020       X       1.0         NaN
      2  2021       X  282872.0   -0.172831
      3  2019       Y       NaN         NaN
      4  2020       Y       NaN         NaN
      5  2021       Y       NaN         NaN
      6  2019       Z    4394.0         NaN
      7  2020       Z     173.7         NaN
      8  2021       Z  518478.0  116.996814
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-28
        • 2022-01-03
        • 1970-01-01
        • 2020-05-28
        • 1970-01-01
        相关资源
        最近更新 更多