我有一个包含整数和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
如果有人可以提供有关如何根据某个非常有用的条件连续计算值的建议,请提前感谢。
答案 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)