Python统计文本文件指定区间数据量:循环与Pandas实现
Python 统计文本文件指定区间数据量时,核心流程是读取文件、定义区间、筛选计数、输出结果。常见数据格式是每行一个数值,目标区间可能是 、、、 等连续区间。下面按基础循环实现和 Pandas 分箱实现两部分说明,并说明边界条件和最后一个 else 容易出错的地方。一、基础循环:读取、判断、计数
先用 load_numbers(file) 读取文件,把每行转换为 float。原文使用 readlines() 逐行读取,再追加到列表。这里要注意:如果文件中有表头、空行或非数值内容,float(line) 会抛 ValueError,需要提前清洗或加 try/except。基础实现如下:
def load_numbers(file):
numbers = []
with open(file, 'r') as f:
for line in f.readlines():
numbers.append(float(line))
return numbers
if __name__ == '__main__':
numbers = load_numbers('XXX.txt')
min1, max1 = 455120, 455140
min2, max2 = 455140, 455160
min3, max3 = 455160, 455180
min4, max4 = 455180, 455200
i = j = k = l = 0
for val in numbers:
# > 和 < 表示不包含边界;若要包含上下限,改成 >= 和 <=
if val > min1 and val < max1:
i += 1
elif val > min2 and val < max2:
j += 1
elif val > min3 and val < max3:
k += 1
else:
l += 1
with open('result.txt', 'w') as f:
f.write('[%d,%d]:%d\n' % (min1, max1, i))
f.write('[%d,%d]:%d\n' % (min2, max2, j))
f.write('[%d,%d]:%d\n' % (min3, max3, k))
f.write('[%d,%d]:%d\n' % (min4, max4, l))
print('done.')
这段代码把区间判断写成 if/elif 链。前三个区间用大于下限且小于上限的条件,最后一个区间直接用 else 承接。如果数据严格落在四个区间内,且不包含边界,结果没有问题;但如果数据可能小于 455120、大于 455200,或者恰好等于 455140、455160、455180 等边界值,它们也会被计入 l,导致第四个区间统计偏大。更严谨的写法是把最后一个分支也写成明确条件:
elif val > min4 and val < max4:
l += 1
如果还需要统计区间外数据,可以再增加一个计数器。边界是否需要包含,必须根据业务定义提前确定:> 和 < 是开区间,>= 和 <= 是闭区间。对于连续区间,常采用“左闭右开”,例如 val >= 下限 and val < 上限,避免边界值被重复统计。
二、Pandas 与 pd.cut:一次性统计多个区间
当数据量较大,或者数据已经在 CSV/Excel 中,用 Pandas 的 pd.cut 分箱会更简洁。它可以把一列数值按 bins 切分,再用 value_counts 汇总。示例:
import pandas as pd
df = pd.read_csv('data.csv', header=None, names=['value'])
bins =
labels = ['455120-455140', '455140-455160', '455160-455180', '455180-455200']
df['range'] = pd.cut(df['value'], bins=bins, labels=labels, right=False)
count = df['range'].value_counts().sort_index()
print(count)
pd.cut 的 right 参数决定区间开闭:默认 right=True,表示左开右闭;传入 right=False 后变成左闭右开。上面 bins 有 5 个边界,因此会得到 4 个区间。如果数据是 Excel,只需把读取方式换成 pd.read_excel('文件.xlsx'),后续分箱和统计逻辑不变。相比手写循环,Pandas 方式更适合数据量大、区间多、需要复用 DataFrame 的场景;手写循环则适合小文件、无第三方依赖或需要嵌入简单脚本的场景。
三、排查与结果输出
如果统计结果不符合预期,优先检查三处:一是文件每行是否都能转换为数值;二是条件中的 >、<、>=、<= 是否与业务边界一致;三是最后一个 else 是否把区间外数据也计入了目标区间。原文将结果写入 result.txt,并用 print('done.') 提示结束。实际使用时,也可以在写入前对计数结果做一次总和校验:各区间计数之和应当等于参与统计的数据总数,若不等,说明边界或过滤逻辑存在遗漏。
总结:统计数据文件特定区间数据量,基础方案是 load_numbers 读取每行数值,再用 if/elif 遍历计数;高效方案是 Pandas + pd.cut 分箱后 value_counts。关键不在循环本身,而在区间开闭、最后一个 else 的边界处理,以及数据读取时的类型转换。
Re: Python统计文本文件指定区间数据量:循环与Pandas实现
楼主的思路很清楚,基础循环和 Pandas 分箱两条路线都覆盖到了。我特别同意最后一个 else 那里很容易踩坑,连续区间统计时如果直接把剩余都归到最后一档,确实会把区间外和边界值也算进去。左闭右开这个处理方式很实用,能避免边界值重复计数。Pandas 的 pd.cut 配合 right=False 和 value_counts 也很简洁,数据量大或区间多的时候会省事很多。另外,读取文件时对空行、表头和非数值行做清洗或异常处理这点很关键,不然 float 转换容易直接报错。最后再用各区间计数之和和参与统计的数据总数对一下,也能快速发现边界或过滤逻辑有没有遗漏。整体内容挺实用的。Re: Python统计文本文件指定区间数据量:循环与Pandas实现
楼主这篇整理得很清楚,尤其是最后一个 else 的坑,确实很容易把区间外或边界值算进第四段。实际写的时候把四个区间都写成明确的 elif,再单独留一个计数器给区间外数据,最后用各区间计数之和和总数对一下,基本能定位大部分边界问题。连续区间用左闭右开也挺合理,比如 val >= 下限 and val < 上限,能避免相邻区间重复统计边界值。Pandas 的 pd.cut 加 right=False 和 value_counts 对多区间确实省事,小文件或不想引入第三方库时用基础循环也够。读取那部分如果文件有表头、空行或异常字符,提前清洗或加 try/except 很必要,不然 float 转换会直接中断。感谢分享,很实用。Re: Python统计文本文件指定区间数据量:循环与Pandas实现
楼主整理得很完整,尤其是把最后一个 else 兜底导致区间外数据被算进第四段这个坑讲透了,这个确实是最容易忽略的地方。基础循环方案里,我一般会把四个区间条件都写全,再额外加一个区间外计数器,这样小于 455120、大于等于 455200 以及落在边界上的数据都能单独看到,不会混进目标区间。读取时如果文件可能有空行或表头,先 strip 再判断,或者用 try/except 包一下 float,不然一个坏行就全断了;数据大时用 for line in f 逐行迭代也比 readlines 省内存。 Pandas 那段用 pd.cut 配 right=False 很清爽,左闭右开能避免连续区间边界重复统计。实际用时如果 CSV 里有空值或非数值,读取后先 dropna 或检查一下,再做 value_counts,最后拿各区间计数之和和有效数据总数对一遍,和楼主说的一样,能很快发现边界或过滤逻辑有没有漏。两种方案各有场景,小文件循环、大文件分箱,思路很实用。
页:
[1]