【发布时间】:2019-01-22 00:17:59
【问题描述】:
我有我在代码中引用为df 的数据框,并且我在每个组的多个列上应用聚合函数。我还应用了用户定义的 lambda 函数f4, f5, f6, f7。一些函数非常相似,例如f4, f6 和f7,只有参数值不同。我可以从 dictionary d 传递这些参数,这样我就只需要编写一个函数而不是编写多个函数吗?
f4 = lambda x: len(x[x>10]) # count the frequency of bearing greater than threshold value
f4.__name__ = 'Frequency'
f5 = lambda x: len(x[x<3.4]) # count the stop points with velocity less than threshold value 3.4
f5.__name__ = 'stop_frequency'
f6 = lambda x: len(x[x>0.2]) # count the points with velocity greater than threshold value 0.2
f6.__name__ = 'frequency'
f7 = lambda x: len(x[x>0.25]) # count the points with accelration greater than threshold value 0.25
f7.__name__ = 'frequency'
d = {'acceleration':['mean', 'median', 'min'],
'velocity':[f5, 'sum' ,'count', 'median', 'min'],
'velocity_rate':f6,
'acc_rate':f7,
'bearing':['sum', f4],
'bearing_rate':'sum',
'Vincenty_distance':'sum'}
df1 = df.groupby(['userid','trip_id','Transportation_Mode','segmentid'], sort=False).agg(d)
#flatenning MultiIndex in columns
df1.columns = df1.columns.map('_'.join)
#MultiIndex in index to columns
df1 = df1.reset_index(level=2, drop=False).reset_index()
我喜欢写这样的函数
f4(p) = lambda x: len(x[x>p])
f4.__name__ = 'Frequency'
d = {'acceleration':['mean', 'median', 'min'],
'velocity':[f5, 'sum' ,'count', 'median', 'min'],
'velocity_rate':f4(0.2),
'acc_rate':f4(0.25),
'bearing':['sum', f4(10)],
'bearing_rate':'sum',
'Vincenty_distance':'sum'}
数据框 df 的 csv 文件可在给定的链接中获得,以使数据更加清晰。 https://drive.google.com/open?id=1R_BBL00G_Dlo-6yrovYJp5zEYLwlMPi9
【问题讨论】:
-
嗯,这可以通过在所有行中使用单个
apply函数来实现。然后从d访问参数。但是您必须创建一个用户定义的函数并在apply中使用它,包括更多代码。 -
你能给我一些有关如何使用字典中的参数调用用户定义函数的相关示例吗?
-
'bearing':['sum', f10(0.2)], def f10(p): return len(x[x>p]) ... 困惑我们如何传递 x在 lambda 中
-
你需要为每一列/大部分列应用它吗?
标签: python-3.x pandas pandas-groupby