【发布时间】:2016-09-07 16:51:23
【问题描述】:
我知道关于这个主题有很多问题,但在这种情况下,建议的答案似乎都不起作用,我认为这是微不足道的,但现在已经杀死了我 2 天。
这是我第一次尝试使用 pandas 处理来自眼动仪的导出文件。导出文件包含大约 50 列,其中 2 列包含瞳孔扩张度量,PupilLeft 和 PupilRight。我想创建一个新列 PupilAvg,将两者取平均值。当眼动仪无法读取一个或两个瞳孔时,它会记录 -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
这是数据框的示例版本:
In[25]: dfd = pd.DataFrame.from_items([('PupilLeft', [3., -1., 4., -1]), ('PupilRight', [4., 4., -1., -1])])
In[26]: dfd
Out[26]:
PupilLeft PupilRight
0 3.0 4.0
1 -1.0 4.0
2 4.0 -1.0
3 -1.0 -1.0
我想在 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 很难处理的请求。
如果有人可以为这个问题提供一个明确的通用解决方案,那将非常有帮助,这基本上可以归结为
“我想使用一个函数来逐行使用其他列的值来计算新列的值,而不是一次全部计算。你知道,就像在 Excel 中一样。有没有一个简单的、通用的怎么办?”
对于像我这样试图从 Excel 解决方案过渡到 python/pandas 的人来说,这尤其困难,因为 Excel 自然是逐行进行的。您只需在第一行单元格中输入一个公式并将其一直复制到该列。显然,这种心态让我对 pandas 的准备不足。
【问题讨论】:
标签: python pandas dataframe calculated-columns