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()
        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)
            with open(os.path.join(folder_path, file_name[:-4] + f'_tumor_{name}.txt'), 'w') as f:
                f.write(tumor_result)

            peritumor_result = calculate_conductivity(peritumor_dict[name], df_saline_median)
            with open(os.path.join(folder_path, file_name[:-4] + f'_peritumor_{name}.txt'), 'w') as f:
                f.write(' '.join(str(i) for i in peritumor_result))

代码解读:

  1. 导入库:导入 NumPy、Pandas 和 os 库,用于数据处理和文件操作。
  2. 定义函数 calculate_conductivity:该函数计算样本的电导率,需要传入样本数据和 saline 中位数数据。
  3. 定义文件夹路径:定义需要读取 CSV 文件的文件夹路径。
  4. 遍历文件夹:使用 os.listdir 函数遍历文件夹内的所有文件,并判断文件是否为 CSV 文件。
  5. 读取 CSV 文件:使用 pd.read_csv 函数读取 CSV 文件,并进行数据预处理,提取需要的列。
  6. 将样本按照 property 分组:将样本数据按照 'property' 列进行分组,并分别存储到 tumor_dictperitumor_dict 字典中。
  7. 计算 saline 的中位数:遍历 'saline' 样本,计算不同频率下的中位数,并存储到 df_saline_median 数据框中。
  8. 计算每个样本的电导率并保存结果:遍历每个样本,调用 calculate_conductivity 函数计算电导率,并使用 with open 语句将结果保存到对应的 TXT 文件中。

修改点:

  • 使用 file_name[:-4] + f'_tumor_{name}.txt' 作为结果文件名,将原文件名和样本名称结合起来,确保每个文件结果都保存到不同的文件中。

运行方法:

  1. 将代码保存为 .py 文件。
  2. 将需要处理的 CSV 文件放置在 folder_path 指定的文件夹中。
  3. 运行代码,代码会自动遍历文件夹,计算每个样本的电导率,并将结果保存到对应的 TXT 文件中。

注意:

  • 代码中使用的频率列表 freq_list 和电导率列表 conductivity_list 需要根据实际情况进行修改。
  • 代码假设 CSV 文件中的列名和数据格式一致,如果数据格式不同,需要修改代码进行适应。
  • 代码中使用 encoding='utf-8' 指定了读取 CSV 文件的编码方式,如果 CSV 文件使用其他编码方式,需要修改编码方式。
  • 代码中假设所有 CSV 文件都包含 'tumor' 和 'peritumor' 样本,以及 'property' 列,如果数据结构不同,需要修改代码进行适应。
Python 电导率计算:遍历文件夹并处理 CSV 文件

原文地址: https://www.cveoy.top/t/topic/jKtR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录