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,并将其全部保留在原位。”干杯!
我有一个具有以下结构的 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,并将其全部保留在原位。”干杯!