计算符合条件的行中的值 - Python

时间:2018-01-31 17:04:47

标签: python pandas if-statement count

我有一个包含整数和NaN的数据框。我几乎要创建一个countif语句,它会迭代一行中的每个值并计算大于0的值。

以下是df:

的示例
d = {'col1': [1, "", 5, 0], 'col2': [3, 4, "", 7], 'col3': [2, 8, "", 3]}
df = pd.DataFrame(data=d)
df = df.convert_objects(convert_numeric = True)

df
Out[356]: 
col1  col2  col3
0   1.0   3.0   2.0
1   NaN   4.0   8.0
2   5.0   NaN   NaN
3   0.0   7.0   3.0

我一直在使用下面这个函数来计算非NaN的值,但我想在此上设置一个条件(大于0&不是NaN)。

df.apply(lambda x: x.count(), axis = 1)
Out[357]: 
0    3
1    2
2    1
3    3
dtype: int64

如果有人可以提供有关如何根据某个非常有用的条件连续计算值的建议,请提前感谢。

2 个答案:

答案 0 :(得分:5)

Pandas允许您广播比较器,因此df>0创建一个数据帧,其中每个条目都是布尔值,具体取决于df的相应条目是否大于0(这也是照顾NaN,因为np.nan > 0被评估为False)。然后,sum方法会将True强制转换为1,将False强制转换为0并查找总数。由于您需要行总计,因此您希望轴为1。所以:

(df>0).sum(axis=1)

答案 1 :(得分:1)

这应该有效:

df.apply(lambda s: (s > 0).sum(), axis=1)

将其转换为布尔值并求它。

示例输出:

  df.apply(lambda s: (s > 1).sum(), axis=1)

输出:

  2
  2
  1
  2
dtype: int64

您也可以在此处使用特定的列式条件,例如:

df.apply(lambda s: (s.col1 > 1).sum(), axis=1)