Python 脚本:从 CSV 文件计算肿瘤和周围组织的电导率
import numpy as np
import pandas as pd
import os
def calculate_conductivity(df, df_saline_median):
conductivity_list = [976, 1987, 3850, 5650, 7450, 9238]
conductivity_list.reverse()
result = []
for i in range(len(freq_list)):
ans = df_saline_median.iloc[:, i:i + 1]
ans = ans.values.tolist()
new_ans = sorted([ans[j][0] for j in range(len(ans))])
result.append(np.interp(df.iloc[:, i + 2:i + 3].median(), new_ans, conductivity_list))
return result
# 定义文件夹路径
folder_path = './test1/'
# 遍历文件夹内的所有csv文件
for file_name in os.listdir(folder_path):
if file_name.endswith('.csv'):
# 读取csv文件
df = pd.read_csv(os.path.join(folder_path, file_name), encoding='utf-8')
df = df.iloc[:, 1:18]
df_tumor = df[df['name'] == 'tumor']
df_peritumor = df[df['name'] == 'peritumor']
df['name'] = df['name'] + df['property']
# 将每个样本按照property分组
tumor_dict = {}
peritumor_dict = {}
for name in ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']:
df_tumor_name = df_tumor[df_tumor['property'] == name]
df_peritumor_name = df_peritumor[df_peritumor['property'] == name]
tumor_dict[name] = df_tumor_name
peritumor_dict[name] = df_peritumor_name
# 计算saline的中位数
concentration_list = ['saline0.05%', 'saline0.10%', 'saline0.20%', 'saline0.30%', 'saline0.40%', 'saline0.50%']
df_saline_median = pd.DataFrame(columns=['1kHz_mag', '2kHz_mag', '3kHz_mag', '7kHz_mag', '11kHz_mag', '17kHz_mag',
'23kHz_mag', '31kHz_mag', '43kHz_mag', '61kHz_mag', '89kHz_mag', '127kHz_mag',
'179kHz_mag', '251kHz_mag', '349kHz_mag'])
for i in concentration_list:
saline_group = df[df['name'] == i]
saline_median = saline_group[['1kHz_mag', '2kHz_mag', '3kHz_mag', '7kHz_mag', '11kHz_mag', '17kHz_mag',
'23kHz_mag', '31kHz_mag', '43kHz_mag', '61kHz_mag', '89kHz_mag', '127kHz_mag',
'179kHz_mag', '251kHz_mag', '349kHz_mag']].median()
df_saline_median.loc[i] = saline_median
# 计算每个样本的电导率并存储结果
freq_list = [1, 2, 3, 7, 11, 17, 23, 31, 43, 61, 89, 127, 179, 251, 349]
conductivity_list = [976, 1987, 3850, 5650, 7450, 9238]
conductivity_list.reverse()
tumor_results = []
peritumor_results = []
for name in ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']:
tumor_result = calculate_conductivity(tumor_dict[name], df_saline_median)
tumor_result = ' '.join(str(i[0]) for i in tumor_result)
tumor_results.append(tumor_result)
peritumor_result = calculate_conductivity(peritumor_dict[name], df_saline_median)
peritumor_result = ' '.join(str(i) for i in peritumor_result)
peritumor_results.append(peritumor_result)
# 写入结果文件
for i, name in enumerate(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']):
with open(os.path.join(folder_path, file_name[:-4] + f'_tumor_{name}.txt'), 'w') as f:
f.write(tumor_results[i])
with open(os.path.join(folder_path, file_name[:-4] + f'_peritumor_{name}.txt'), 'w') as f:
f.write(peritumor_results[i])
该脚本使用 os.listdir 函数遍历文件夹内的所有文件,并使用 pd.read_csv 函数读取每个 CSV 文件。然后,根据样本类型和特性计算电导率,并将结果写入相应的文本文件。
使用方法:
- 将脚本保存为 Python 文件,例如
calculate_conductivity.py。 - 将 CSV 文件放置在
test1文件夹中。 - 运行脚本,例如:
python calculate_conductivity.py。
注意:
- 该脚本假定 CSV 文件包含名为
name和property的列,以及一系列频率相关的磁场测量值(例如1kHz_mag,2kHz_mag等)。 - 该脚本使用
np.interp函数进行线性插值计算电导率。 - 可以根据需要修改脚本中使用的电导率列表和频率列表。
- 输出文件将命名为
[文件名]_tumor_[特性].txt和[文件名]_peritumor_[特性].txt,例如data_tumor_A.txt和data_peritumor_A.txt。
原文地址: https://www.cveoy.top/t/topic/jKvw 著作权归作者所有。请勿转载和采集!