如何使用groupby将函数应用于pandas列?

时间:2017-08-09 22:51:42

标签: python pandas numpy dataframe

处理包含段(有两个端点)的数据框,我必须找到每个段的中点,最后插入在df中的一行,中间点坐标在两者之间终点行。

以下是df:

   id         x          y
0   1    0.8000       1.90
1   1    0.8833       2.00
2   2    1.0000       2.14
3   2    1.3000       2.50

具有相同 id 的点是同一段的终点。

创建了以下简单的函数(基本上是计算均值):

def find_mpt(x1, y1, x2, y2):
    x, y = ( x1 + x2) / 2 , (y1 + y2) / 2
    return x, y

想要将func应用于整个df,并且专门在结束点行之间插入结果行,如下所示:

   id         x          y
0   1    0.8000       1.90
1   1    0.8416       1.95  #new row 
2   1    0.8833       2.00
3   2    1.0000       2.14
4   2    1.1500       2.32  #new row       
5   2    1.3000       2.50

也许我可以使用df.groupby(['id'])然后应用该函数,但仍然不知道如何在这些特定位置插入行。

2 个答案:

答案 0 :(得分:1)

可以指定聚合方法。根据定义的函数,我认为你想要将d和x的平均值加到你的df中。由于只涉及两个端点,因此简化了程序。

df2 = df.groupby('id').agg('mean').reset_index()
df_final = pd.concat((df, df2)).sort_values(['id', 'y']).reset_index(drop=True)
print(df_final)

   id      x     y
0   1  0.80000  1.90
1   1  0.84165  1.95
2   1  0.88330  2.00
3   2  1.00000  2.14
4   2  1.15000  2.32
5   2  1.30000  2.50

是的,这也可以通过单线实现。

答案 1 :(得分:0)

这是通过自我功能计算的,

def find_mpt(x):
    ret = np.mean(x)
    return ret

pd.concat([df2,df2.groupby('id',as_index=False).apply(lambda x:find_mpt(x))],axis=0).sort_values(['id','y'])


Out[26]: 
    id        x     y
0  1.0  0.80000  1.90
0  1.0  0.84165  1.95
1  1.0  0.88330  2.00
2  2.0  1.00000  2.14
1  2.0  1.15000  2.32
3  2.0  1.30000  2.50