Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中计算数据帧的每列中的非零值_Python_Pandas_Dataframe - Fatal编程技术网

在python中计算数据帧的每列中的非零值

在python中计算数据帧的每列中的非零值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个python数据帧,其中第一列是user\u id,其余列是标记(tag\u 0到tag\u 122)。 我有以下格式的数据: UserId Tag_0 Tag_1 7867688 0 5 7867688 0 3 7867688 3 0 7867688 3.5 3.5 7867688 4 4 7867688 3.5 0 我的目标是为每个用户id实现Sum(Tag)/Count(NonZero(Tags)) df.groupby('user_id').sum(),给

我有一个python数据帧,其中第一列是user\u id,其余列是标记(tag\u 0到tag\u 122)。 我有以下格式的数据:

UserId  Tag_0   Tag_1
7867688 0   5
7867688 0   3
7867688 3   0
7867688 3.5 3.5
7867688 4   4
7867688 3.5 0
我的目标是为每个用户id实现
Sum(Tag)/Count(NonZero(Tags))

df.groupby('user_id').sum()
,给我
sum(tag)
,但我对计算非零值一无所知

是否可以在一个命令中实现
Sum(Tag)/Count(NonZero(Tags))

在MySQL中,我可以实现以下目标:-

select user_id, sum(tag)/count(nullif(tag,0)) from table group by 1

感谢您的帮助。

要计算非零值,只需执行
(column!=0)。sum()
,其中
column
是您要执行此操作的数据<代码>列!=0返回一个布尔数组,True为1,False为0,因此求和得到与条件匹配的元素数

因此,要获得您想要的结果,请执行以下操作

df.groupby('user_id').apply(lambda column: column.sum()/(column != 0).sum())

我最喜欢的获取每列中非零数量的方法是

df.astype(bool).sum(axis=0)
对于每行中的非零数量,请使用

df.astype(bool).sum(axis=1)
(感谢Skulas)

如果df中有NAN,则应先将其设为零,否则将计为1

df.fillna(0).astype(bool).sum(axis=1)

(感谢SirC)

为什么不使用
np.count\u non-zero

  • 要计算整个数据帧的非零数量,
    np.count\u nonzero(df)
  • 计算所有行的非零数的步骤
    np.count\u非零(df,轴=0)
  • 计算所有列的非零数的步骤
    np.计数非零(df,轴=1)

  • 它也适用于日期

    @BrenBram如果某些单元格中出现负值,该怎么办?@HarshSingal:
    column!=0
    将查找所有非零的值,无论它们是正值还是负值。抱歉,没有准确说明问题。当我实现上述方法时,SUM(Tags)为负数的用户的id在输出中返回了-inf,而正SUM(Tags)执行得很好。我一直不明白为什么@HarshSingal:如果没有非零标记(因此非零标记的计数为零),则可以获得
    inf
    。对于这种情况,您的原始公式没有很好的定义,因此您需要考虑您希望结果是什么。我认为您的意思是axis=0。如果你做轴=1,你将计算非零rows@skulas抢手货我猜大多数人来这里是为了划船,这就是为什么以前没有人抱怨过:)这是一个伟大的一行!要获取所有未指定的列值null@Amir然而,日期类型会是零吗?如果您的数据帧中有nan,这是很危险的,它们会对总和做出贡献。感谢您的回答!我最终得到了这个解决方案,因为我认为它是非常人性化的。我只修改了两件事:为了理解“为所有行获取非零值的数量”(您的案例2),我需要
    axis=1
    ,而不是
    axis=0
    。我更喜欢将输出作为熊猫系列,所以我使用了
    result=pd.Series(index=df.index,data=np.count\u nonzero(df,axis=1))
    这应该是可以接受的答案。