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创 ...
随机推荐
- ctfshow web入门 文件包含全部wp
Web78 <?php if(isset($_GET['file'])){ $file = $_GET['file']; include($file); }else{ highlight_fil ...
- Spark1.6和2.0版本区别(一) 累加器
1.6版本 2.0版本
- Ethernet协议和ARP协议分析
实验介绍: 在信息的传输中,协议至关重要. 使用的实验环境是 kali 2017.arp协议还需要用到靶机centos7 如果是kali的其他版本可能会导致无法抓包. 一:网络分析工具(kali) S ...
- hexo 图片添加水印(png, jpeg, jpg, gif)
文章同步发布:https://blog.jijian.link/2020-04-21/hexo-watermark/ 本文折腾 hexo 图片添加水印功能,大部分代码沿用: nodejs 图片添加水印 ...
- 启动本地node服务器报错: Access denied for user ‘root‘@‘localhost‘ (using password: YES)
背景:今天启动node服务时直接报错,顿时一激灵,之前(几个月前哈哈)明明好好的.主要问题就是在连接数据库上,我登上mysql瞅瞅有没有问题,当要输入密码时,emmm, 很好, 忘记root密码了,于 ...
- golang 逃逸分析详解
疑问 请问main调用GetUserInfo后返回的&User{...}.这个变量是分配到栈上了呢,还是分配到堆上了? package main type User struct { ID i ...
- Windows 提权-服务_弱服务权限
本文通过 Google 翻译 Weak Service Permissions – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行 ...
- oracle的各版本的名称
我最早接触的是oracle的版本8那个时候是8i i是internet后来是9i然后到10,就是版本10g g是grid的意思然后是11g然后12就变成了C,就是12c c是cloud的意思然后后面的 ...
- FireDAC开发DataSnap应用系统【3】-使用TFDJSONDatasets的CRUD功能
类别 说明 TFDJSONDeltas 包含异动的delta的类别.客户端存放deltade对象 TFDJSONDeltasWriter 把deltas写入TFDJSONDeltas TFDJSOND ...
- FastAPI依赖注入作用域与生命周期控制
title: FastAPI依赖注入作用域与生命周期控制 date: 2025/04/08 00:02:10 updated: 2025/04/08 00:02:10 author: cmdragon ...