pandas数据帧中的条件列算法

时间:2015-01-28 10:56:58

标签: python numpy 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)但仅限于那些条件为'列包含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,由于除零,无法进行计算。

提前致谢。

2 个答案:

答案 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 的新手,我花了一段时间才找到这个有用的线程。谁能推荐一些综合教程来练习这些类型的算术运算?我需要“过滤/分组/切片一个数据帧,然后将不同的功能/操作分别或一次性应用于每个组/切片,并将其保持原位。”干杯!