如何在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实现方案
核心思路是先指定目标列,然后针对这些列单独计算:
- 定义需要计算的目标列:
target_cols = ['1.1', '2.1', '3.1', '4.1']
- 新增
Count列(统计非零值数量):
这里用ne(0)(不等于0)替代astype(bool),逻辑更直观——非零值返回True,求和就是非零值的数量:
df['Count'] = df[target_cols].ne(0).sum(axis=1)
- 新增
Sum列(计算数值之和):
直接对指定列按行求和即可:
df['Sum'] = df[target_cols].sum(axis=1)
运行后就能得到你想要的结果,和期望输出完全一致。
Dask实现方案
Dask DataFrame的API和Pandas高度兼容,实现逻辑几乎相同,只是Dask采用延迟计算,需要手动触发计算才能看到结果:
- 先创建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')
- 同样定义目标列:
target_cols = ['1.1', '2.1', '3.1', '4.1']
- 新增
Count和Sum列:
ddf['Count'] = ddf[target_cols].ne(0).sum(axis=1) ddf['Sum'] = ddf[target_cols].sum(axis=1)
- 触发计算查看结果:
因为Dask是延迟执行的,需要调用compute()方法得到实际的结果:
result = ddf.compute() print(result)
这样就能得到和Pandas完全一致的输出了。
内容的提问来源于stack exchange,提问作者s_khan92
相关产品推荐
相关产品推荐

