2015-11-16 59 views
0

内计算新列这个问题似乎简单的给我,但我已经在这上面花了两天,并没有发现任何东西作为尚未...大熊猫从另外两个列变量数据帧

要重申的问题:如何计算熊猫数据框中的新列,其值是将另外两个变量作为位于同一数据框中的参数的函数的返回结果。

以下是我正在使用的数据框的简化示例。

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 

我有一个返回的星历高度即需要全局参数为纬度/经度,datetime和被键控关闭satid简化如下的两个线路的元素列表的可变参数的函数。

def ephem_func(datetime,tle[satid],lat,lon): 
    do_ephemeris_calcs... 
    return altitude 

由于我的功能是依赖于satid和日期时间,它们都发现了我的数据框里面我希望做这样的事情:

df['altitude'] = (df['datetime'], df['sat_id']).map(lambda x, y: ephem_func(x,tle[y],lat,lon)) 

然而,这是不是一个东西,不管多少次我说“python please”它不起作用。

grouped = df.groupby('sat_id') 

for key, item in grouped: 
    item['altitude'] = item['datetime'].map(lambda x: ephem_func(x,tle[key],lat,lon)) 

但是,使用这种方法,我不认为我实际上分配值回到我原来的数据帧:

我也用熊猫GROUPBY来解决这个如下尝试。如果我修改数据帧被分配到代表原始如下:

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

好了,所以我还没有找到一个非常符合Python或熊猫式的解决方案,这一点,但我没有改变我的大图片的逻辑使用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) 

现在,我都这些列表中,我可以创建一个新的数据框“结果”,将日期与我们的原始数据框合并荷兰国际集团的九如合并关键,以确保一切都保持一字排开 结果= pandas.DataFrame()

results['datetime'] = datelist 
results['ix'] = ixlist 
results['sat_id'] = satlist 
results['altitude'] = altitude 

final=pd.merge(df,results,on='ix') 

这为我工作,并合并计算出的高度成一个数据帧与我开始了数据的其余部分用。

如果您有更高效的方式做到这一点,请回复!

谢谢

0

你的功能ephem_func尚不清楚,但我尽量建议解决方案:

print df 
# ix sat_id   datetime signal 
#0 0  13 2015-11-13 16:33:00 654884 
#1 1  13 2015-11-13 16:33:00 654883 
#2 2  87 2015-11-13 16:33:00 657889 
#3 3  87 2015-11-13 16:33:00 558774 
#4 4  87 2015-11-13 16:33:00 555222 
#5 5  99 2015-11-13 16:33:00 444555 
#6 6  99 2015-11-13 16:33:00 444333 

#custom function 
def ephem_func(ix, signal): 
    #do_ephemeris_calcs... 
    return ix + signal 

#function call for each group 
def f(df): 
    df['altitude'] = ephem_func(df['ix'], df['signal']) 
    return df 

grouped = df.groupby('sat_id').apply(f) 
print grouped 
# ix sat_id   datetime signal altitude 
#0 0  13 2015-11-13 16:33:00 654884 654884 
#1 1  13 2015-11-13 16:33:00 654883 654884 
#2 2  87 2015-11-13 16:33:00 657889 657891 
#3 3  87 2015-11-13 16:33:00 558774 558777 
#4 4  87 2015-11-13 16:33:00 555222 555226 
#5 5  99 2015-11-13 16:33:00 444555 444560 
#6 6  99 2015-11-13 16:33:00 444333 444339 
+0

感谢您的回复,但我认为您错过了我的问题。对不起,如果我不清楚,我已更新我的帖子,以更好地说明所需的结果和被问到的问题。我不相信这个功能的内部运作与这个问题有关 – fireitup