我有一个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)但仅限于那些条件为'列包含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'依次单步执行每一行的想法感到高兴。循环,然后使用'如果'进行计算的语句,但我拥有的实际数据帧非常大,我想以基于数组的方式进行计算。这可能吗?我想我可以计算所有行的值,然后删除我不想要的那些但这似乎是很多浪费的努力(NaN在数据帧中非常罕见),在某些情况下,&#39 ;条件'等于1,由于除零,无法进行计算。
提前致谢。
答案 0 :(得分:9)
使用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
答案 1 :(得分:0)
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'。在第二个代码片段中,就地标志也能很好地工作(就像在第一个代码片段中一样。)
我从 pandas official site "where" 和 pandas official site "indexing"
找到了这些解决方案这种操作正是我大部分时间所需要的。我是 Pandas 的新手,我花了一段时间才找到这个有用的线程。谁能推荐一些综合教程来练习这些类型的算术运算?我需要“过滤/分组/切片一个数据帧,然后将不同的功能/操作分别或一次性应用于每个组/切片,并将其保持原位。”干杯!