将Pandas函数应用于多个列

时间:2017-07-12 12:03:06

标签: python pandas

我已经设置了一个功能,我将其设置为返回两个值(称为Site& Date)。我尝试使用df.apply创建两个新列,每个列代表一个返回值。我不想两次或多次应用此函数,因为它需要很长时间,因此我需要某种方法将两列的值设置为函数中的两个或更多值。这是我的代码。

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

输入值生物量是坐标的数据框,行' lat' lng''日期'都是来自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之后[&#39;日期&#39;]。

2 - 如果坐标之间的距离大于2,则网站名称为&#39;更改为“无”&#39;

3 - 它从网站名称中删除任何重复项,确保只有一行的值为&#39; Null&#39;。

4 - 它返回&#39;站点名称&#39;的值&安培; &#39;纬度&#39;其中&#39;运营日期&#39;至少。

我需要我的代码返回生物量的第一个(按日期)记录,其中df1&amp;的坐标之间的距离。生物量小于2km。

希望我能够返回许多不同半径的第一条记录,例如2公里,4公里,6公里,8公里,10公里内的第一个生物量站点。

1 个答案:

答案 0 :(得分: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