【问题标题】:Pandas group by with conditional transform()熊猫分组条件转换()
【发布时间】:2023-01-03 00:54:14
【问题描述】:

我正在处理熊猫的一个问题:

我想按索引列对 DataFrame 进行分组,然后执行 transform(np.gradient)(即计算一组中所有值的导数)。如果我的组太小(少于 2 个元素),这将不起作用,所以在这种情况下我只想返回 0。

以下代码返回错误:

import pandas as pd
import numpy as np


data = pd.DataFrame(
        {
            "time": [0,0,1,2,2,3,3],
            "position": [0.1,0.2,0.2,0.1,0.2,0.1,0.2],
            "speed": [150.0,145.0, 149.0,150.0,150.0,150.0,150.0],
        }
    )

derivative = data.groupby("time").transform(np.gradient)

给我一个 ValueError:

ValueError: Shape of array too small to calculate a numerical gradient, at least (edge_order + 1) elements are required.

上面示例 DataFrame 的期望输出是

time position_km                
0    0.1                    -5.0
     0.2                    -5.0
1    0.2                     0.0
2    0.1                     0.0
     0.2                     0.0
3    0.1                     0.0
     0.2                     0.0

有没有人知道如何解决这个问题,例如在 transform 中使用 lambda 函数?

【问题讨论】:

  • 也许:lambda x: np.gradient(x) if len(x) >= 2 else 0
  • 好吧,显然我今天需要完成编码,因为你的简短解决方案有效 :D 我不确定如何使用参数 x,但显然那真的只是关注的组......

标签: python pandas dataframe


【解决方案1】:
derivative = data.groupby("time").transform(lambda x: np.gradient(x) if len(x) > 1 else 0)

正是我想要的。谢谢@Chrysophylaxs

【讨论】:

    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2019-03-06
    • 2021-12-13
    • 2019-02-15
    相关资源
    最近更新 更多