我想在执行聚合后获得一个点列表。假设我有以下数据集:
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
使用groupby
和apply
得到理想的结果:
df.groupby('name').apply(func_unique).reset_index(name='anything')