2017-07-12 87 views
2

我已經設置了一個函數來返回兩個值(稱爲Site & Date)。我試圖使用df.apply創建兩個新列,每個列表示返回的值之一。我不想將這個函數應用兩次或更多次,因爲它會花費很長時間,所以我需要一些方法將兩列的值設置爲函數中的兩個或更多值。這是我的代碼。將熊貓函數應用於多列

df1[['Site','Site Date']] = df1.apply(
    lambda row: firstSite(biomass, row['lat'], row['long'], row['Date']), 
    axis = 1) 

輸入值生物量是座標的數據幀,row'lat','lng','Date'是來自df1的所有列。如果我決定將這個函數應用於df ['Site'],它可以很好地工作,但是當我想將值應用於兩列時,我得到這個錯誤。

ValueError: Shape of passed values is (999, 2), indices imply (999, 28) 

def firstSite(biomass, lat, long, date): 

    biomass['Date of Operation'] = pd.to_datetime(biomass['Date of Operation']) 
    biomass = biomass[biomass['Date of Operation'] <= date] 

    biomass['distance'] = biomass.apply(
     lambda row: distanceBetweenCm(lat, long, row['Lat'], row['Lng']), 
     axis=1) 
    biomass['Site Name'] = np.where((biomass['distance'] <= 2), biomass['Site Name'], "Null") 
    biomass = biomass.drop_duplicates('Site Name') 
    Site = biomass.loc[biomass['Date of Operation'].idxmin(),'Site Name'] 
    Lat = biomass.loc[biomass['Date of Operation'].idxmin(),'Lat'] 
    return Site, Lat 

此功能有幾個任務:

1 - 它從生物質其中的日期爲DF1 [ '日期']後刪除任何行。

2 - 如果座標之間的距離超過2個,「網站名稱」更改爲「空」

3 - 它消除了從網站名稱的重複,確保只會有一排值爲'Null'。

4 - 它返回「站點名稱」的值&'拉特'其中'操作日期'最少。

我需要我的代碼返回來自生物量的第一個(按日期)記錄,其中生物量的座標之間的距離小於2公里。

希望我能夠返回許多不同半徑的第一條記錄,如2km,4km,6km,8km,10km內的第一個生物量站點。

+0

什麼是'打印(df2.info())''如果DF2 = df1.apply( 拉姆達行:firstSite(生物量,行['lat'],行['long'],行['Date']), axis = 1)'? – jezrael

+0

AttributeError:'Series'對象沒有屬性'info' – christaylor

+0

好吧,所以輸出是'Series',那麼爲什麼要把輸出添加到2列呢? '當輸出是系列(df中的列)時''df1 [['Site','Site Date']]'? – jezrael

回答

2

我認爲你需要的功能恢復Series有2個值:

df1 = pd.DataFrame({'A':list('abcdef'), 
        'lat':[4,5,4,5,5,4], 
        'long':[7,8,9,4,2,3], 
        'Date':pd.date_range('2011-01-01', periods=6), 
        'E':[5,3,6,9,2,4], 
        'F':list('aaabbb')}) 

print (df1) 
    A  Date E F lat long 
0 a 2011-01-01 5 a 4  7 
1 b 2011-01-02 3 a 5  8 
2 c 2011-01-03 6 a 4  9 
3 d 2011-01-04 9 b 5  4 
4 e 2011-01-05 2 b 5  2 
5 f 2011-01-06 4 b 4  3 

biomass = 10 
def firstSite(a,b,c,d): 
    return pd.Series([a + b, d]) 

df1[['Site','Site Date']] = df1.apply(lambda row: firstSite(biomass, 
                row['lat'], row['long'], row['Date']), 
                axis = 1) 
print (df1) 
    A  Date E F lat long Site Site Date 
0 a 2011-01-01 5 a 4  7 14 2011-01-01 
1 b 2011-01-02 3 a 5  8 15 2011-01-02 
2 c 2011-01-03 6 a 4  9 14 2011-01-03 
3 d 2011-01-04 9 b 5  4 15 2011-01-04 
4 e 2011-01-05 2 b 5  2 15 2011-01-05 
5 f 2011-01-06 4 b 4  3 14 2011-01-06 
+0

好的,謝謝,會試試這個! – christaylor

+0

這是有效的!非常感謝! – christaylor

+0

很高興能提供幫助。請不要忘記upvote並接受解決方案。謝謝。 – jezrael

相關問題