Pandas从数据框

时间:2015-11-16 20:55:00

标签: python pandas

这个问题对我来说似乎很简单,但是我已经花了几天时间而且还没有找到任何东西...

重述问题:如何计算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

这里有任何指导意见。谢谢!

1 个答案:

答案 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')

这对我有用,并将计算出的高度合并为一个数据帧,其中包含我开始使用的其余数据。

如果您有更有效的方法,请回复!

由于