Python 熊猫从dataframe中的另外两个列变量计算新列
这个问题对我来说似乎很简单,但我已经花了几天时间在它上面,到目前为止还没有发现任何东西 重申这个问题:如何在一个数据帧中计算一个新列,该列的值是一个函数的返回结果,该函数将两个其他变量作为位于同一数据帧中的参数 下面是我正在使用的数据帧的一个简化示例Python 熊猫从dataframe中的另外两个列变量计算新列,python,pandas,Python,Pandas,这个问题对我来说似乎很简单,但我已经花了几天时间在它上面,到目前为止还没有发现任何东西 重申这个问题:如何在一个数据帧中计算一个新列,该列的值是一个函数的返回结果,该函数将两个其他变量作为位于同一数据帧中的参数 下面是我正在使用的数据帧的一个简化示例 ix sat_id datetime signal 0 13 11/13/2015 16:33 654884 1 13 11/13/2015 16:33 654883 2 87
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
我有一个函数,返回星历高度,它接受lat/lon的全局参数,datetime的变量参数和satid的两行元素列表,简化如下
def ephem_func(datetime,tle[satid],lat,lon):
do_ephemeris_calcs...
return altitude
由于我的函数依赖于satid和datetime,这两者都可以在我的数据帧中找到,所以我希望这样做:
df['altitude'] = (df['datetime'], df['sat_id']).map(lambda x, y: ephem_func(x,tle[y],lat,lon))
然而,这不是一件事,无论我说多少次“python please”,它都不起作用
我还尝试使用pandas groupby解决此问题,如下所示:
grouped = df.groupby('sat_id')
for key, item in grouped:
item['altitude'] = item['datetime'].map(lambda x: ephem_func(x,tle[key],lat,lon))
df['altitude'] = item['datetime'].map(lambda x: ephem_func(x,tle[key], lat,lon))
然而,使用这种方法,我并不认为我实际上是在将值赋回到原始数据帧。如果我修改分配的数据帧以表示原始数据,如下所示:
grouped = df.groupby('sat_id')
for key, item in grouped:
item['altitude'] = item['datetime'].map(lambda x: ephem_func(x,tle[key],lat,lon))
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
在此,我们非常感谢您的指导。谢谢 好的,所以我还没有找到一个非常类似于python或Pandas的解决方案,但我确实修改了我的全局逻辑,以使用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)
现在我有了所有这些列表,我可以创建一个新的数据框“结果”,使用ix作为合并键将日期与原始数据框合并,以确保所有内容保持一致
结果=pandas.DataFrame()
这对我很有用,并将计算出的高度与我开始使用的其他数据合并到一个数据帧中
如果你有更有效的方法,请回复
谢谢