这个问题对我来说似乎很简单,但是我已经花了几天时间而且还没有找到任何东西...
重述问题:如何计算pandas数据框中的新列,其值是函数的返回结果,该函数将另外两个变量作为位于同一数据帧中的args。
以下是我正在使用的数据框的简化示例。
ix sat_id datetime signal
0 13 11/13/2015 16:33 654884
1 13 11/13/2015 16:33 654883
2 87 11/13/2015 16:33 657889
3 87 11/13/2015 16:33 558774
4 87 11/13/2015 16:33 555222
5 99 11/13/2015 16:33 444555
6 99 11/13/2015 16:33 444333
我有一个返回星历高度的函数,它接受lat / lon的全局参数,datetime的变量参数和两个以satid为基础的行元素列表,简化如下。
def ephem_func(datetime,tle[satid],lat,lon):
do_ephemeris_calcs...
return altitude
由于我的函数依赖于satid和datetime,这些都在我的数据框中找到,我希望这样做:
df['altitude'] = (df['datetime'], df['sat_id']).map(lambda x, y: ephem_func(x,tle[y],lat,lon))
然而,这不是一件事,无论我说多少次" python please"它不起作用。
我也尝试过使用pandas groupby来解决这个问题,如下所示:
grouped = df.groupby('sat_id')
for key, item in grouped:
item['altitude'] = item['datetime'].map(lambda x: ephem_func(x,tle[key],lat,lon))
然而,使用这种方法我不认为我实际上将值分配回原始数据帧。如果我修改分配的数据帧以表示原始数据,如下所示:
df['altitude'] = item['datetime'].map(lambda x: ephem_func(x,tle[key], lat,lon))
然后我遇到分组数据上的每个新迭代的问题,将新值分配回原始数据帧,但是用nan覆盖先前迭代中的行。
期望的结果:将我的数据框中包含的两个变量(sat_id和datetime)传递到我的函数中,并将返回的值指定为新列。
index sat_id datetime signal altitude
0 13 11/13/2015 16:33 654884 45
1 13 11/13/2015 16:33 654883 65
2 87 11/13/2015 16:33 657889 -45
3 87 11/13/2015 16:33 558774 90
4 87 11/13/2015 16:33 555222 88
5 99 11/13/2015 16:33 444555 77
6 99 11/13/2015 16:33 444333 66
这里有任何指导意见。谢谢!
答案 0 :(得分:0)
好的,所以我没有找到一个非常pythonic或Pandas式的解决方案,但我确实修改了我的大图逻辑以获得我想要使用groupby和一些严重的数据改组...
请记住,我的简化功能的结构如下:
def ephem_func(datetime,tle[satid],lat,lon):
do_ephemeris_calcs...
return altitude
我的数据如下
ix sat_id datetime signal
0 13 11/13/2015 16:33 654884
1 13 11/13/2015 16:33 654883
2 87 11/13/2015 16:33 657889
3 87 11/13/2015 16:33 558774
4 87 11/13/2015 16:33 555222
5 99 11/13/2015 16:33 444555
6 99 11/13/2015 16:33 444333
这是我的解决方案:
grouped = df.groupby('sat_id')
for key,item in grouped:
date_range = []
ix_range = []
date_range = item['datetime']
ix_range = item['ix']
for date,ix in zip(date_range,ix_range):
satlist.append(key)
datelist.append(date)
ixlist.append(ix)
alt = ephem_func(date,tle[key],lat,lon)
altitude.append(alt)
现在我已经拥有了所有这些列表,我可以创建一个新的数据帧'结果'使用ix作为合并键将日期与原始数据帧合并,以确保所有内容保持排列 results = pandas.DataFrame()
results['datetime'] = datelist
results['ix'] = ixlist
results['sat_id'] = satlist
results['altitude'] = altitude
final=pd.merge(df,results,on='ix')
这对我有用,并将计算出的高度合并为一个数据帧,其中包含我开始使用的其余数据。
如果您有更有效的方法,请回复!
由于