python - Pandas new Column 具有列表理解和引用现有列的 if 语句

标签 python pandas dataframe

我尝试通过列表理解和 if 语句向 DataFrame 添加新列,如下所示:

SD['Ln(aT) ANALYTIC'] = [x + 1 for x in SD['T'] if SD['T'] >= SD['TG']]

我收到此错误:

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

我不知道如何处理这个问题。

有什么建议吗?

编辑: DataFrame 看起来像:

enter image description here

最佳答案

使用numpy.where带 bool 掩码:

mask = SD['T'] >= SD['TG']
SD['Ln(aT) ANALYTIC'] = np.where(mask, SD['T'] + 1, SD['T'])

或者:

SD['Ln(aT) ANALYTIC'] = np.where(mask, SD['T'] + 1, np.nan)

列表理解是可能的,但速度很慢:

SD['Ln(aT) ANALYTIC1'] = [i + 1 if i >= j else i for i, j in zip(SD['T'], SD['TG'])]

SD = pd.DataFrame({'T': [1,2,3],
                   'TG':[2,5,1]})

#[3000 rows x 2 columns]
SD = pd.concat([SD] * 1000, ignore_index=True)


In [294]: %timeit SD['Ln(aT) ANALYTIC1'] = [i + 1 if i >= j else i for i, j in zip(SD['T'], SD['TG'])]
1.18 ms ± 82.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [295]: %timeit SD['Ln(aT) ANALYTIC2'] = np.where(SD['T'] >= SD['TG'], SD['T'] + 1, SD['T'])
511 µs ± 16.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

关于python - Pandas new Column 具有列表理解和引用现有列的 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52367518/

相关文章:

python - 使用两个键合并数据帧表

python - 基于 Pandas 数据框中列值的顶部底部配对

r - 我如何快速探索数据框中所有列的类?

python - 从装饰器覆盖函数的子函数?

python-3.x - 如何使用逻辑运算符从具有 categoricalDtype 的列中选择 pandas 数据框中的行

python - Keras Unet + VGG16 预测都一样

python - 带有元组的字典放入数据框

r - 在返回多个值的 apply 函数中处理 NA 值

Python pywin32 - VK_SLEEP 按下不工作

python - 你能像在 Pytorch 中那样将变量传递给 Python 中的数据成员吗?