这个问题对我来说似乎很简单,但是我花了几天时间,到目前为止还没有发现任何东西。
重申一下问题:我如何在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
我有一个返回星历表高度的函数,该函数使用纬度/经度的全局参数,日期时间的变量参数,以及以简单的方式键入的两个线元素的列表,简化如下。
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多少次”,它都不起作用。
我还尝试使用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
任何指导在这里表示赞赏。谢谢!
好的,所以我还没有找到一个非常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作为合并键,将日期与原始数据框合并回去,以确保所有内容都保持对齐结果= pandas.DataFrame()
results['datetime'] = datelist
results['ix'] = ixlist
results['sat_id'] = satlist
results['altitude'] = altitude
final=pd.merge(df,results,on='ix')
这对我有用,并将计算出的海拔高度与我开始使用的其余数据合并到一个数据框中。
如果您有更有效的方法,请回覆!
谢谢
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句