2015-11-16 82 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