使用条件变换()的Pandas分组依据

0ejtzxu1  于 2023-01-04  发布在  其他
关注(0)|答案(2)|浏览(105)

我正在研究Pandas的一个问题:
我想将一个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函数?

ffdz8vbo

ffdz8vbo1#

derivative = data.groupby("time").transform(lambda x: np.gradient(x) if len(x) > 1 else 0)

做的正是我想要的。谢谢@ Chrysophylax

dtcbnfnu

dtcbnfnu2#

可能的选择:

def gradient_group(group):
  if group.shape[0] < 2:
    return 0
  return np.gradient(group)

df['derivative'] = df.groupby(df.index).apply(gradient_group)

相关问题