我有一个函数,其中我设置了返回两个值(称为Site和Date)。我正在尝试使用df.apply创建两个新列,每个列代表一个返回的值。我不想多次应用此函数,因为这将需要很长时间,所以我需要一种方式将两个列的值设置为函数中的两个或多个值。以下是我的代码。
df1[['Site','Site Date']] = df1.apply(
lambda row: firstSite(biomass, row['lat'], row['long'], row['Date']),
axis = 1)
输入值生物量是一个数据帧,其中行“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['Date']之后的任何行。
2 - 如果坐标之间的距离大于2,'Site Name'的值将被更改为'Null'。
3 - 它将从站点名称中删除重复项,并确保只有一个值为'Null'的行。
4 - 它返回'Date of Operation'最早的'Site Name'和'Lat'的值。
我需要我的代码返回距离df1和生物量之间坐标距离小于2公里的第一条记录。
希望能够返回许多不同半径内的第一条记录,例如2公里、4公里、6公里、8公里、10公里内的第一个生物量站点。
df2 = df1.apply(lambda row: firstSite(biomass, row['lat'], row['long'], row['Date']), axis=1)
,那么print(df2.info())
是什么意思? - jezraelSeries
,那么为什么要将输出添加到2列中呢?当输出是Series
(在df中的列)时,为什么要这样做df1[['Site','Site Date']]
? - jezraeldf['Site'] = tmp[0]
。 - jf328