如何统计DataFrame满足条件的行数并生成指定结构的新DataFrame
嘿,我来帮你搞定这两个Pandas数据处理的问题,都是日常分析里高频用到的操作:
1. 统计DataFrame中满足条件的行数
这里有几种实用的方法,按需选择就行:
- 布尔索引求和法:先构造一个布尔条件(满足条件的行返回
True,否则False),然后对这个布尔序列求和——因为Pandas会把True当作1,False当作0,求和结果就是符合条件的行数。
举个例子,要统计df['age'] > 18的行数:
如果是多条件组合,记得用(df['age'] > 18).sum()&表示“且”、|表示“或”,每个条件要加括号避免运算优先级问题:((df['score'] >= 60) & (df['score'] <= 100) & (df['grade'] == 'A')).sum() - query方法+长度统计:用
df.query()写自然语言风格的条件,然后取结果的行数,可读性更强:# 两种方式都能拿到行数 len(df.query("score >=60 and score <=100 and grade == 'A'")) # 或者用shape[0]直接取行数 df.query("score >=60 and score <=100 and grade == 'A'").shape[0]
2. 生成统计特定条件的DataFrame B
针对你说的需求——从DataFrame A生成3列的B,每列对应A的a、b、c列中满足「值在5-10之间(5≤i≤10)且z列等于1」的行数——这里有两种简洁的实现方式:
方法一:封装函数+逐个计算(清晰易懂)
先定义一个通用的统计函数,避免重复写相同的逻辑,然后分别计算a、b、c列的符合条件行数,最后构造B:
import pandas as pd # 假设你的DataFrame A已经存在 # 先定义过滤条件:z列等于1 z_condition = A['z'] == 1 def count_valid_column(col): # 组合条件:列值在5-10之间,且z列等于1 return ((col >= 5) & (col <= 10) & z_condition).sum() # 计算各列的统计值 count_a = count_valid_column(A['a']) count_b = count_valid_column(A['b']) count_c = count_valid_column(A['c']) # 构造DataFrame B,注意要把统计值放在列表里,这样生成的是一行数据 B = pd.DataFrame({'a': [count_a], 'b': [count_b], 'c': [count_c]})
方法二:用apply批量处理(更简洁)
直接对A的a、b、c列批量应用统计逻辑,再转成DataFrame:
import pandas as pd z_condition = A['z'] == 1 # 选择a、b、c列,对每列应用统计逻辑 stats_series = A[['a', 'b', 'c']].apply( lambda col: ((col >=5) & (col <=10) & z_condition).sum() ) # 把Series转成一行的DataFrame,就是我们要的B B = stats_series.to_frame().T
举个实际例子验证
假设你的A是这样的:
A = pd.DataFrame({ 'a': [3, 7, 6, 8], 'b': [12, 9, 4, 10], 'c': [5, 11, 7, 6], 'z': [1, 1, 0, 1] })
按照规则统计:
- a列:第2行(7,z=1)、第4行(8,z=1)符合条件,计数2
- b列:第2行(9,z=1)、第4行(10,z=1)符合条件,计数2
- c列:第1行(5,z=1)、第4行(6,z=1)符合条件,计数2
生成的B就是:
a b c 0 2 2 2
内容的提问来源于stack exchange,提问作者user8864947
相关产品推荐
相关产品推荐

