Pandas 批量处理文本表
就是一个批量读取文件, 然后计算指标的过程. 难度到是没啥, 只是想记录一把, 毕竟这类的需求, 其实还是蛮多的.
但涉及一些数据的安全, 和指标这块也是不能透露的, 因此只能是贴上代码, 目的还是给自己以后做参考的. 代码中有个常数, 其实表示每个文件, 每行的同位置的值, 是一样的. 是发现规律了, 最开始是找近似, 去最为接近的一条, 后来写完发现, 根本不用不动. 然后, 文本数据, 就是后缀不是常用的, Excel, Csv.. 这种, 给我有个 xx.sed 从未见过的这类. 还好我基本功可以, 毕竟当年抄过书本, read_table 这类的骚操作, 就恰好满足需求了.
因为涉及的数据不能公开, 业务这块也不能谈及, 指标计算比较多和杂. 总之是给我自己看的, 并未作为分享的.
from os import listdir
import pandas as pd
from math import log10
import time
# 发现数据规律, 每个文件的第一列值 Wvl 都是固定的, 直接取即可
# 每个指标值行索引(Wvl)可以先全部找出来
R990 = 990.4
R720 = 719.5
R860 = 860.2
R790 = 789.7
R670 = 669.4
R730 = 730.2
R525 = 525.2
R750 = 749.9
R705 = 704.8
R445 = 444.5
R550 = 550.1
R870 = 869.5
R680 = 680.3
R810 = 809.7
R800 = 799.7
R700 = 699.4
R840 = 840.1
R1510 = 1511.8
R1680 = 1681.2
start = time.time()
ret = [] # 结果
my_dir = './光谱数据集/'
file_list = listdir(my_dir)
for cur_file in file_list:
print("正在处理:", cur_file)
df = None
try:
df = pd.read_table(my_dir + cur_file, skiprows=26)
# df['nb'] = df['Raw Counts (Ref.)'] - df['Raw Counts (Target)']
df['nb'] = round(df['Reflect. %'] / 100, 2)
df = df.set_index('Wvl')['nb']
except Exception as e:
print("出错啦, 大兄弟!", e)
# 计算着一大坨数据指标
cur_lst = []
# 被文件名作为 第一个数据
cur_lst.append(cur_file)
# RSI
rsi = df.loc[R990] / df.loc[R720]
cur_lst.append(rsi)
# NDSI
ndsi = (df.loc[R860] - df.loc[R720]) / (df.loc[R860] + df.loc[R720])
cur_lst.append(ndsi)
# FD_NDVI
fdndvi = (df.loc[R730] - df.loc[R525]) / (df.loc[R730] + df.loc[R525])
cur_lst.append(fdndvi)
# RENDVI
cur_lst.append((df.loc[R750] - df.loc[R705]) / (df.loc[R750] + df.loc[R705]))
# mNd705
cur_lst.append((df.loc[R750] - df.loc[R705]) / (df.loc[R750] + 2 * df.loc[R445]))
# GNDVI
cur_lst.append((df.loc[R790] - df.loc[R550]) / (df.loc[R790] + df.loc[R550]))
# SAVI
cur_lst.append(1.5 * (df.loc[R870] - df.loc[R680]) / (df.loc[R870] + df.loc[R680] + 0.16))
# OSIVI
cur_lst.append(1.16 * (df.loc[R810] - df.loc[R680]) / (df.loc[R810] - df.loc[R680] + 0.16))
# MSAVI
cur_lst.append(
2 * (df.loc[R800] + 1 - ((2 * df.loc[R800] + 1) * 2 - 8 * (df.loc[R800] - df.loc[R670])) * 0.5)
)
# DCNA
cur_lst.append(
(df.loc[R720] - df.loc[R700]) / (df.loc[R700] - df.loc[R670]) / (df.loc[R700] - df.loc[R670] + 0.03)
)
# CIgreen
cur_lst.append(((df.loc[R840] - df.loc[R870]) / df.loc[R550]) - 1)
# NINI
try:
cur_lst.append(
(log10(1 / df.loc[R1510]) - log10(1 / df.loc[R1680])) / (log10(1 / df.loc[R1510]) + log10(1 / df.loc[R1680]))
)
except:
print(cur_file, "log 计算有问题")
cur_lst.append('lg计算失败')
# TVI
cur_lst.append(
0.5 * (120 * (df.loc[R750] - df.loc[R550]) - 200 * (df.loc[R670] - df.loc[R550]))
)
# DSI
cur_lst.append(df.loc[R800] - df.loc[R680])
# 将当前结果添加到 ret 中
ret.append(cur_lst)
# 最后将 [[],[]...] 再存为 DataFrame
col = ['数据文件名', 'RSI', 'NDSI', 'FD_NDVI', 'RENDVI', 'mNd705', 'GNDVI', 'SAVI',
'OSIVI', 'MSAVI', 'DCNA', 'CIgreen', 'NINI', 'TVI','DSI']
data = pd.DataFrame(ret,
columns=col)
print()
print("*"*50)
print("正在存储到, 表格...")
data.to_excel("D:/光谱数据.xlsx", index=False)
end = time.time()
print(f"处理完毕! 共处理 {len(file_list)} 个文件, 总共用时 {round(end - start, 2)} 秒")
print("*"*50)
其实蛮简单的一个脚本, 循环读取文件夹的数据, 然后来弄即可. 发现现在这换了 台式电脑, 果然很稳, 同时 读取 文本数据, 远比 Excel 文件, 效率高了 近 10倍.
正在处理: 20190930_00128.sed
正在处理: 20190930_00129.sed
正在处理: 20190930_00130.sed
正在处理: 20190930_00131.sed
正在处理: 20190930_00132.sed
正在处理: 20190930_00133.sed
正在处理: 20190930_00134.sed
正在处理: 20190930_00135.sed
正在处理: 20190930_00136.sed
正在处理: 20190930_00137.sed
正在处理: 20190930_00138.sed
正在处理: 20190930_00139.sed
正在处理: 20190930_00140.sed
正在处理: 20190930_00141.sed
正在处理: 20190930_00142.sed
正在处理: 20190930_00143.sed
正在处理: 20190930_00144.sed
正在处理: 20190930_00145.sed
正在处理: 20190930_00146.sed
正在处理: 20190930_00147.sed
......
**************************************************
正在存储到, 表格...
处理完毕! 共处理 1447 个文件, 总共用时 5.58 秒
**************************************************
[Finished in 6.1s]
- 经常谈什么批量处理文件, 其实就是, 结构化的, 对单个文件, 逻辑写好, 然后循环处理 n 多个文件.
- 对指标计算, 设计好号数据结构, 列表, 字典这些, 最好是用 生成器 yield 来弄, 最后再 list 出来, 提高性能
- 3年多了, 真实觉得 Pandas 是真的好用哇, 尤其是处理方面, 主要是现在很多逻辑, 是通过 sql 这样产生对比.
Pandas 批量处理文本表的更多相关文章
- 按键精灵如何批量复制文本,再往excel里面一次性粘贴?
原帖地址 http://zhidao.baidu.com/link?url=M2A9E1JF7wAzjtxMQG9uiW_PvP39HVlfwn6zDMzk9m6U05JA37SrgDcrVXg_c9 ...
- 【转载】使用Pandas创建数据透视表
使用Pandas创建数据透视表 本文转载自:蓝鲸的网站分析笔记 原文链接:使用Pandas创建数据透视表 目录 pandas.pivot_table() 创建简单的数据透视表 增加一个行维度(inde ...
- Mac下用命令行直接批量转换文本编码到UTF8
由于近期在Mac下写Android程序,下载的一些Demo由于编码问题源码里的汉字出现乱码,文件比较多,所以想批量解决下文件的编码问题. Mac下有以下两种方式可以解决: A. 文件名的编码:Mac的 ...
- 使用一个T-SQL语句批量查询数据表占用空间及其行数
原文:使用一个T-SQL语句批量查询数据表占用空间及其行数 要找到数据库中数据表占用的空间和存在的行数.可以使用sp_spaceused搭配数据表的名称.就可以产生该表耗用的空间和现有行数. 如: U ...
- R实战 第七篇:绘图文本表
文本表是显示数据的重要图形,一个文本表按照区域划分为:列标题,行标题,数据区,美学特征有:前景样式.背景央视.字体.网格线等. 一,使用ggtexttable绘图文本表 载入ggpubr包,可以使用g ...
- Sql Server利用游标批量清空数据表
先吐槽一下,由于公司要为新客户部署一个全新的系统,然而公司并没有空库,所以只能把正在线上运行的数据库给备份,然后清空相关数据 下面分享一下我在做清空数据库时写的一个批量清空数据表的方法 思路:查询出该 ...
- Python3 批量替换文本内容
Python3 批量替换文本内容 示例: # coding:utf8 import os; def reset(): i = 0 path = r"H:\asDemo\workdemo\aw ...
- Shell 脚本批量创建数据库表
使用 Shell 脚本批量创建数据表 系统:Centos6.5 64位 MySQL版本:5.1.73 比如下面这个脚本: #!/bin/bash #批量新建数据表 for y in {0..199}; ...
- SAP查询TABLE对应的文本表
SAP 取数时,通常配置项,需要取对应的文本描述,一般在配置表后加个T,就可以找到描述对应的表名. 但有时也有不符合这个规则的,例如生产订单类型数据表 T003O. 表名加T后并不存T003OT. 这 ...
- 基于CentOS的MySQL学习补充三--使用Shell批量创建数据库表
本文出处:http://blog.csdn.net/u012377333/article/details/47006087 接上篇介绍<基于CentOS的Mysql学习补充二--使用Shell创 ...
随机推荐
- android studio真机调试华为手机
背景 近来开发一个视频通话App,需要在华为手机上调试,按网上一顿操作,开启了USB调试之后,发现手机连上电脑后,android studio没反应,在此记录下解决方法.调试的手机型号是华为 nova ...
- intellij debug模式提示 Method breakpoints may dramatically slow down debugging 解决办法
直接上图........ 点击图中按钮 或者 快捷键(Ctrl - Shift -F8 ) 出现下图
- 在Unity中玩转表达式树:解锁游戏逻辑的动态魔法
html { overflow-x: initial !important } :root { --bg-color: #ffffff; --text-color: #333333; --select ...
- QT5笔记:17. QComboBox和QPlainTextEdit
例子 #include "widget.h" #include "ui_widget.h" #include <QTextBlock> Widget ...
- 基于项目的协同过滤推荐算法(Item-Based Collaborative Filtering Recommendation Algorithms)
前言 协同过滤推荐系统,包括基于用户的.基于项目的息肉通过率等,今天我们读一篇基于项目的协同过滤算法的论文. 今天读的论文为一篇名叫<基于项目的协同过滤推荐算法>(Item-Based C ...
- 有限元方法[Matlab]-笔记
<-- 访问笔记代码仓库 --> << MATLAB Codes for Finite Element Analysis - Solids and Structures (Fe ...
- SQL注入之WAF绕过注入
绕过WAF: WAF防御原理: 简单来说waf就是解析http请求,检测http请求中的参数是否存在恶意的攻击行为,如果请求中的参数和waf中的规则库所匹配,那么waf则判断此条请求为攻击行为并进行阻 ...
- SpringBoot整合Dubbox(无XML配置)
简介 Dubbox是当当网对阿里的Dubbo进行增强的一个分支.在使用springboot之后,我们发现很多配置并不一定要使用xml.这篇文章的目的是让你使用Dubbox时能像使用springboot ...
- Qt QSqlDatabase的removeDatabase需要注意的地方
文章目录 问题描述 Qt官方解决方法 另外一种解决方式 碎碎念 关于智能指针 问题描述 今天在做之前代码的重构的时候,在调用QSqlDatabase的removeDatabase函数的时候,出现了如下 ...
- JMeter BeanShell 获取 HTTP Request 中的 Name
场景:添加 JMeter log 输出,想输入自定义请求的名称 // 获取 response body prev.getResponseDataAsString(); // 获取 HTTP Reque ...