You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas和Dask DataFrame中对指定列进行非零计数与求和?

在Pandas和Dask中为DataFrame新增指定列的行非零值计数与求和列

问题背景

你有如下结构的DataFrame:

import pandas as pd

df = pd.DataFrame({
    'id': [1, 2, 3],
    'Car': ['BMW', 'Volvo', 'VW'],
    'Model': ['Model1', 'V1', 'Polo'],
    '1.1': [2, 0, 5],
    '2.1': [5, 0, 2],
    '3.1': [2, 10, 4],
    '4.1': [0, 3, 5]
})

需要新增两列:

  • Count:每行指定列(1.1、2.1、3.1、4.1)中的非零值数量
  • Sum:每行指定列的数值之和

期望输出:

id    Car   Model  1.1  2.1  3.1  4.1  Count  Sum
0   1    BMW  Model1    2    5    2    0      3    9
1   2  Volvo      V1    0    0   10    3      2   13
2   3     VW    Polo    5    2    4    5      4   16

你提到了用df.fillna(0).astype(bool).sum(axis=1),但需要仅对指定列操作,同时想知道Dask中的实现方式。


Pandas实现方案

核心思路是先指定目标列,然后针对这些列单独计算:

  1. 定义需要计算的目标列:
target_cols = ['1.1', '2.1', '3.1', '4.1']
  1. 新增Count列(统计非零值数量):
    这里用ne(0)(不等于0)替代astype(bool),逻辑更直观——非零值返回True,求和就是非零值的数量:
df['Count'] = df[target_cols].ne(0).sum(axis=1)
  1. 新增Sum列(计算数值之和):
    直接对指定列按行求和即可:
df['Sum'] = df[target_cols].sum(axis=1)

运行后就能得到你想要的结果,和期望输出完全一致。


Dask实现方案

Dask DataFrame的API和Pandas高度兼容,实现逻辑几乎相同,只是Dask采用延迟计算,需要手动触发计算才能看到结果:

  1. 先创建Dask DataFrame(假设你已经有了数据源):
import dask.dataframe as dd

# 方式1:从Pandas DataFrame转换
ddf = dd.from_pandas(df, npartitions=1)

# 方式2:从文件读取(比如csv)
# ddf = dd.read_csv('your_data_file.csv')
  1. 同样定义目标列:
target_cols = ['1.1', '2.1', '3.1', '4.1']
  1. 新增Count和Sum列:
ddf['Count'] = ddf[target_cols].ne(0).sum(axis=1)
ddf['Sum'] = ddf[target_cols].sum(axis=1)
  1. 触发计算查看结果:
    因为Dask是延迟执行的,需要调用compute()方法得到实际的结果:
result = ddf.compute()
print(result)

这样就能得到和Pandas完全一致的输出了。


内容的提问来源于stack exchange,提问作者s_khan92

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:47:28