pandas 数据框中的条件列算法

Conditional column arithmetic in pandas dataframe

我有一个具有以下结构的 pandas 数据框:

import numpy as np
import pandas as pd
myData = pd.DataFrame({'x': [1.2,2.4,5.3,2.3,4.1], 'y': [6.7,7.5,8.1,5.3,8.3], 'condition':[1,1,np.nan,np.nan,1],'calculation': [np.nan]*5})

print myData

   calculation  condition    x    y
0          NaN          1  1.2  6.7
1          NaN          1  2.4  7.5
2          NaN        NaN  5.3  8.1
3          NaN        NaN  2.3  5.3
4          NaN          1  4.1  8.3

我想根据 'x' 和 'y' 中的值(例如 x/y)在 'calculation' 列中输入一个值,但仅限于'condition' 列包含 NaN (np.isnan(myData['condition'])。最终数据框应如下所示:

   calculation  condition    x    y
0          NaN          1  1.2  6.7
1          NaN          1  2.4  7.5
2        0.654        NaN  5.3  8.1
3        0.434        NaN  2.3  5.3
4          NaN          1  4.1  8.3

我对使用 'for' 循环依次遍历每一行然后使用 'if' 语句进行计算的想法感到满意,但我拥有的实际数据框非常大并且我想以基于数组的方式进行计算。这可能吗?我想我可以计算所有行的值,然后删除我不想要的那些,但这似乎浪费了很多精力(数据框中的 NaN 非常罕见),并且在某些情况下 'condition'等于1,被零除无法计算

提前致谢。

使用 where 并将您的条件传递给它,这将只在行满足条件的情况下执行您的计算:

In [117]:

myData['calculation'] = (myData['x']/myData['y']).where(myData['condition'].isnull())
myData
Out[117]:
   calculation  condition    x    y
0          NaN          1  1.2  6.7
1          NaN          1  2.4  7.5
2     0.654321        NaN  5.3  8.1
3     0.433962        NaN  2.3  5.3
4          NaN          1  4.1  8.3

EdChum 的回答对我很有效!尽管如此,我还是想扩展这个帖子,因为我认为它对其他人有用。

假设您的数据框是

          c     x    y
0         1   1.2  6.7
1         1   2.4  7.5
2         0   5.3  8.1
3         0   2.3  5.3
4         1   4.1  8.3

并且您想用关联的 x/y.

更新 c 列中的 0
          c     x    y
0         1   1.2  6.7
1         1   2.4  7.5
2      0.65   5.3  8.1
3      0.43   2.3  5.3
4         1   4.1  8.3

你可以做到

myData['c'] = (myData['x']/myData['y']).where(cond=myData['c']==0, other=myData['c'])

myData['c'].where(cond=myData['c'] != 0, other=myData['x']/myData['y'], inplace=True)

两种不满足'cond'的情况,都执行'other'。在第二个代码片段中,inplace 标志也能很好地工作(就像在第一个代码片段中一样。)

我从 pandas official site "where" and pandas official site "indexing"

中找到了这些解决方案

这种操作正是我大部分时间所需要的。我是 Pandas 的新手,我花了一段时间才找到这个有用的帖子。谁能推荐一些综合教程来练习这些类型的算术运算?我需要“过滤/分组/切片数据帧,然后分别或一次对每个 group/slice 应用不同的 functions/operations,并将其全部保留在原位。”干杯!