(七)一个实例(抽行,抽列,构建字典,统计分析数据)

这篇博客提供了Python数据处理的实例,包括从`DatasMsg.csv`文件中抽取行和列,以及使用代码`commons.py`和`extrainfo.py`进行数据字典构建与统计分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上code,供我以后参考,两个小部分

code1: commons.py
# 打开文件,默认为"读文件"
def open_file(filename, mode='r'):
    return open(filename, mode, encoding='utf-8', errors='ignore')


# 读入数据,默认分割符为','
def read_file(filename, splitchar=','):
    all_datas = []
    with open_file(filename) as f:
        for line in f:
            data = line.strip().split(splitchar)
            if data:
                all_datas.append(data)
    return all_datas
code2: extrainfo.py
"""
find_datas:
从DatasMsg.csv中提取与“打架”相关的数据行
每列均由','隔开
源文件中列号6标注了每行数据的类型,通过对列6的判断,抽取文件。

extra_datas1:
从XxzsInfo.csv中提取与“打架”类型相关的列
每列均由','隔开
# 提取"打架"中类型内容,列号分别为0, -10,-7, -2

extra_datas2:
抽取KeyInfo.csv的子集,要求为
每行Info'发生原因'或'行为特征'不为空值

calculate_type1:
计算'打架'的类型,以及每种类型的对应的个数
"""
from commons import open_file
from commons import read_file
import ast


# 找到"打架"的数据(一行一行匹配),生成新文件
def find_datas(infilepath, outfilepath, strinfo):
    JQdatas = read_file(infilepath)
    temp = ''
    # 按行处理
    for i in range(0, len(JQdatas)):
        if JQdatas[i][6] == strinfo or i == 0:
            for j in range(0, len(JQdatas[i])):
                temp = temp + str(JQdatas[i][j]) + ','
            temp = temp + '\n'
    open_file(outfilepath, mode='w').write(temp)


"""
抽取"打架"文件中我需要的那几列,生成新文件
# 注意的是,由于文件中','不是只做分割符用,中间有1列混用了','
# 所以用','分割后,每行的列数其实是不等的。
# 所幸的是,从最后一列算的话,可以抽取到我要的那几列,所以采取了负值索引
"""


def extra_datas1(infilepath, outfilepath, a=0, b=-10, c=-7):
    Xxzsdatas = read_file(infilepath)
    temp = ''
    for i in range(0, len(Xxzsdatas)):
        temp = temp + Xxzsdatas[i][a] + ',' + Xxzsdatas[i][b] + ',' + Xxzsdatas[i][c] + ',' + Xxzsdatas[i][-2] + '\n'
    open_file(outfilepath, mode='w').write(temp)


# 即便抽取了我要的几列,有些行某些列值为空,我也不要这些列,再抽一次,生成新文件
def extra_datas2(infilepath, outfilepath):
    KeyInfo = read_file(infilepath)
    temp = ''
    # 按行处理
    for i in range(0, len(KeyInfo)):
        if KeyInfo[i][1] != '' or KeyInfo[i][2] != '' or i == 0:
            for j in range(0, len(KeyInfo[i])):
                temp = temp + str(KeyInfo[i][j]) + ','
            temp = temp + '\n'
    open_file(outfilepath, mode='w').write(temp)


# 把我最后得到的文件变成字典,做一些统计分析(比如统计类型type的个数)
# 最终字典形如{type1:value1,...}
def calculate_type1(infilepath):
    data = read_file(infilepath)
    tempset = set()
    for i in range(1, len(data)):
        tempset.add(data[i][1])
    # 这里复制_的结果再转为str,最后把str转为dict是因为fromkeys创建的字典,字典值会同步更新,所以多走了一步
    _ = dict.fromkeys(list(tempset), 0)
    type = ast.literal_eval(str(_))
    for i in range(1, len(data)):
        type[data[i][1]] += 1
    return type, data


find_datas('DatasMsg.csv', 'XxzsInfo.csv', '打架')
extra_datas1('XxzsInfo.csv', 'KeyInfo.csv')
extra_datas2('KeyInfo.csv', 'Sub_KeyInfo.csv')
types, datas = calculate_type1('Sub_KeyInfo.csv')
print(' {0} 条类型非空的打架数据中,共有 {1} 种类型的警情:。\n 对应的字典为:\n{2}'.format(len(datas), len(types), types))
# print(types.keys())
# print(types.values())
# print(types.items())

原始数据(DatasMsg.csv)样式
列名1,列名2,列名3,列名4,列名5,....
value1,value2,value3,value4,value5,....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值