pandas 在Python中计算DataFrame的每列中的非零值

sg2wtvxw  于 2023-05-21  发布在  Python
关注(0)|答案(5)|浏览(429)

我有一个python-pandas-DataFrame,其中第一列是"user_id",其余列是标签("Tag_0""Tag_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

我的目标是为每个user_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

任何帮助将不胜感激。

tkclm6bt

tkclm6bt1#

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

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

对于每行中的非零数,使用

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

(感谢Skulas)
如果你的df中有nans,你应该先把它们设为零,否则它们会被算作1。

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

(感谢Sirc)

bwitn5fc

bwitn5fc2#

为什么不使用np.count_nonzero
1.要计算整个 Dataframe 的非零个数,请执行np.count_nonzero(df)
1.计算所有行np.count_nonzero(df, axis=0)的非零个数
1.计算所有列np.count_nonzero(df, axis=1)的非零数
它也适用于日期。

6rvt4ljy

6rvt4ljy3#

要计算非零值,只需执行(column!=0).sum(),其中column是您要计算的数据。column != 0返回一个布尔数组,True为1,False为0,因此将其求和可以得到符合条件的元素数。
为了得到你想要的结果,

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

iklwldmw4#

我知道这个问题很老,但似乎OP的目的与问题标题不同:
我的目标是为每个user_id实现Sum(Tag)/Count(NonZero(Tags))。
对于OP的目标,我们可以用NaN替换0并使用groupby + mean(这是可行的,因为mean默认跳过NaN):

out = df.replace(0, np.nan).groupby('UserId', as_index=False).mean()

输出:

UserId  Tag_0  Tag_1
0  7867688    3.5  3.875
dy1byipe

dy1byipe5#

一个简单的列表解析,用于获取df每列中非零值的计数:

[np.count_nonzero(df[x]) for x in df.columns]

相关问题