如何统计大型dataframe每行中特定及各类元素的数量?
嘿,针对你这个拥有239行、54万多列的大型DataFrame统计需求,我给你整理了高效的解决方案——毕竟这么宽的表,得用最快的方法才行!
1. 统计每行所有元素(A/B/0)的数量
因为你的数据元素只有A、B、0三种,优先用向量化操作(比循环或apply快得多,适合大数据量):
假设你的DataFrame第一列是rs编号(比如示例里的rs22233…),先把数据列和编号列区分开:
import pandas as pd # 假设你的DataFrame叫df,先提取数据列(排除第一列的编号) data_cols = df.columns[1:]
然后分别统计每行A、B、0的数量:
# 统计每行A的数量 df['count_A'] = df[data_cols].eq('A').sum(axis=1) # 统计每行B的数量 df['count_B'] = df[data_cols].eq('B').sum(axis=1) # 统计每行0的数量(注意如果0是字符串就用'0',数字就用0) df['count_0'] = df[data_cols].eq('0').sum(axis=1)
如果想一次性得到所有类别的统计结果(生成单独的统计DataFrame),可以用value_counts,但记得填充缺失类别(避免某些行没有A/B/0时出现NaN):
# 对每行做value_counts,并用reindex确保A、B、0都存在,缺失的填0 row_counts = df[data_cols].apply( lambda x: x.value_counts().reindex(['A', 'B', '0'], fill_value=0), axis=1 ) # 把统计结果合并到原DataFrame df = pd.concat([df, row_counts], axis=1)
不过注意:这个方法比向量化的eq().sum()慢一点,适合需要一次性输出所有类别统计的场景。
2. 统计每行中特定元素的数量
如果只需要统计某一个或几个特定元素的数量,用下面的方法:
- 单个元素(比如只统计A):
df['A_count'] = df[data_cols].eq('A').sum(axis=1) - 多个元素(比如统计A和B的总数):
df['AB_total'] = df[data_cols].isin(['A', 'B']).sum(axis=1)
3. 针对超大型DataFrame的优化技巧
因为你的表有54万多列,内存占用可能较高,这里给你两个优化点:
- 转为分类数据:把A、B、0转为category类型,能大幅降低内存占用,同时加快统计速度:
df[data_cols] = df[data_cols].astype('category') - 避免循环/低效操作:绝对不要用Python循环遍历每行每列统计,速度会慢到难以接受,一定要用pandas的向量化API(比如
eq()、isin()、sum())。
举个和你示例数据匹配的例子:
假设你的示例数据是:
id col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 0 rs22233… B B B B B B B B B B B 1 rs38622… B B B B B B B B A B A 2 rs13933… B B A B B B B B B B B 3 rs38637… B B A A A B B B A B A 4 rs12554… B B B B A B A B B B B 5 rs41105… A A A A B A B A A A B
运行向量化统计代码后,第二行(rs38622…)的count_A会是2,count_B是9,完全符合数据情况。
内容的提问来源于stack exchange,提问作者张力三
相关产品推荐
相关产品推荐

