使用函数从pandas行中的旧列值计算新列值

2024-10-04 03:26:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道关于这个话题有很多问题,但在这个问题上,所有建议的答案似乎都不起作用,我认为这是微不足道的,但已经让我痛苦了两天。在

这是我第一次尝试使用pandas处理来自眼睛跟踪器的导出文件。导出文件包含大约50列,其中2列包含瞳孔扩张测量值PupilLeft和PupilRight。我想创建一个新的列,PupilAvg,它将这两个值平均。当眼动跟踪器无法读取一个或两个瞳孔时,它会记录a-1。由于所需的逻辑很简单,但对于lambda来说似乎有点长,所以我编写了一个函数来返回新列的值:

def getEyeAvg(left, right): 
    # calcs avg for Left and Right where one or both may be missing (= -1)
    if left == -1 and right == -1: return np.nan
    if left == -1: return right
    if right == -1: return left  
    return (left + right)/2.0 

以下是dataframe的示例版本:

^{pr2}$

我想在PupilRight之后插入新列,因此我尝试使用以下命令:

In[27]: dfd.insert(2, 'PupilAvg', getEyeAvg(dfd.PupilLeft, dfd.PupilRight))

我对PupilAvg的期望是:

   PupilLeft  PupilRight  PupilAvg
0        3.0         4.0       3.5
1       -1.0         4.0       4.0
2        4.0        -1.0       4.0
3       -1.0        -1.0       NaN

当然这不管用

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我已经看到了这个问题反复被问的变化,似乎每个答案都使用了一些不同的“技巧”,鉴于我的相对初学者的身份,这对我来说似乎是不可理解的。例如,如果left==-1,我既不想要'any'也不想要'all'行,我只想要当前行,但这似乎是pandas发现很难处理的请求。在

如果有人能为这个问题提供一个清晰的通用解决方案,那将是非常有帮助的,基本上可以归结为

"I want to use a function to calculate values for a new column using values from other columns on a row-by-row basis, not all at once. You know, just like in Excel. Is there a simple, general way to do that?"

这对于像我这样试图从Excel解决方案过渡到python/pandas的人来说尤其困难,因为Excel自然是一行一行的。您只需在第一行单元格中输入一个公式,然后将其一直复制到列的下方。很明显,这种心态让我对熊猫没什么准备。在


Tags: 文件to答案rightpandasreturnifall
1条回答
网友
1楼 · 发布于 2024-10-04 03:26:05

在整列操作时,有一种实现目标的简单方法。在

dfd.replace({-1:np.nan}, inplace=True)
dfd['PupilAvg'] = dfd.mean(axis=1)

如果出于某种原因需要保留原始的-1值,只需先复制它们,然后再继续。熊猫身上的每一件事都很简单,有了明确的nan值。在

您的原始代码失败了,因为您将整个数据列传递到getEyeAvg。在您的示例中,它试图评估pd.DataFrame.from_项([('PupilLeft',[3.,-1.,4.,-1])==-1,而不是3。==1。在pandas中,一次操作整个列是默认模式,因此需要一种新的思维方式。没有任何一种最好的方法可以做到这一点,因为最有意义的方法来自于Excel(直接通过索引或使用跨行循环)数据框应用(lambda,axis=1)比使用整列慢得多。在

相关问题 更多 >