Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫从dataframe中的另外两个列变量计算新列_Python_Pandas - Fatal编程技术网

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()

这对我很有用,并将计算出的高度与我开始使用的其他数据合并到一个数据帧中

如果你有更有效的方法,请回复

谢谢