通过应用自定义函数分组



我想在执行聚合后获得一个点列表。假设我有以下数据集:

AC_ID,AC_PERIOD,ROU_ROUTE_ID,SEQUENCE_NR,SEG_POINT_FROM_ID,SEG_POINT_TO_ID
502,S,A1,1,BRY,LUREN
502,S,A1,2,LUREN,DJL
502,S,A1,3,DJL,LISMO
502,S,A1,4,LISMO,SIROD
502,S,A100,1,KL,*ROS1
502,S,A100,2,*ROS1,AMEPU
502,S,A100,3,AMEPU,SARZI

最后,我希望有:

A1,[BRY, LUREN, DJL, LISMO]
A100,[KL, *ROS1, AMEPU, SARZI]

如您所见,我将按rou_route_id分组,并从SEG_POINT_FROM_ID + SEG_POINT_TO_ID的最后一个元素中获取所有元素。

为了做到这一点,我开始使用一个组by,我想应用一个函数,我将创建之前,为了做点的逻辑。

像这样:

data.groupby('ROU_ROUTE_ID')[['SEG_POINT_FROM_ID','SEG_POINT_TO_ID']].apply(lambda x: f(x))

我的问题是我不能访问f(x)中的两列。

我认为有一种更快的方法来做这个计算,但是我在这个问题上卡住了几个小时。

我也在考虑做一个不使用熊猫的迭代算法,但我不知道它是否会比使用熊猫更优化。

import pandas as pd

def testfun(x):
print(x["b"])
print(x["c"])

if __name__ == '__main__':
test = pd.DataFrame({
"a": [1, 1, 1, 1, 2, 2, 2, 2, 2],
"b": [1, 1, 1, 1, 2, 2, 2, 2, 2],
"c": [1, 1, 1, 1, 2, 2, 2, 2, 2]
})
test.groupby("a")[["b", "c"]].apply(testfun)

我不知道你有什么问题。您可以很好地访问应用函数中的列。

您可以通过使用apply()并将x作为带有您想要使用的两列的DataFrame来访问lambda函数中的两列:

import pandas as pd
data = pd.DataFrame({
'AC_ID': [502, 502, 502, 502, 502, 502, 502],
'AC_PERIOD': ['S', 'S', 'S', 'S', 'S', 'S', 'S'],
'ROU_ROUTE_ID': ['A1', 'A1', 'A1', 'A1', 'A100', 'A100', 'A100'],
'SEQUENCE_NR': [1, 2, 3, 4, 1, 2, 3],
'SEG_POINT_FROM_ID': ['BRY', 'LUREN', 'DJL', 'LISMO', 'KL', '*ROS1', 'AMEPU'],
'SEG_POINT_TO_ID': ['LUREN', 'DJL', 'LISMO', 'SIROD', '*ROS1', 'AMEPU', 'SARZI']
})

def f(x):
return x['SEG_POINT_FROM_ID'].tolist() + [x['SEG_POINT_TO_ID'].iloc[-1]]

result = data.groupby('ROU_ROUTE_ID').apply(f)
print(result)

输出:

ROU_ROUTE_ID
A1      [BRY, LUREN, DJL, LISMO, SIROD]
A100          [KL, *ROS1, AMEPU, SARZI]

数据示例:

df = pd.DataFrame({'name':[1,1,1,1,2,2,2,2],
'val1':['a','b','c','d','e','f','g','h'],
'val2':['b','c','a','w','f','g','h','y']})
df

从两列中获取唯一值的函数:

def func_unique(g):
tem = g['val1'].tolist() + g['val2'].tolist()
tem = list(set(tem))
return tem

使用groupbyapply得到理想的结果:

df.groupby('name').apply(func_unique).reset_index(name='anything')

相关内容

  • 没有找到相关文章

最新更新