这段代码中使用了一个for循环遍历文件夹内的所有csv文件,但是在每次循环中,都会对同一个变量file_name进行赋值,所以在最后一次循环结束后,file_name的值就是最后一个csv文件的文件名。因此,后面的代码只会处理最后一个csv文件,而不是所有的csv文件。

为了解决这个问题,可以将遍历文件夹内的所有csv文件的代码块放在一个函数中,并且将每个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

def process_csv_files(folder_path):
    # 定义结果列表
    result_list = []
    
    # 遍历文件夹内的所有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)
                peritumor_result = calculate_conductivity(peritumor_dict[name], df_saline_median)
                result_list.append((file_name, name, tumor_result, peritumor_result))
    
    # 将结果写入文件
    for file_name, name, tumor_result, peritumor_result in result_list:
        with open(os.path.join(folder_path, file_name[:-4] + f'_tumor_{name}.txt'), 'w') as f:
            f.write(' '.join(str(i[0]) for i in tumor_result))
        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))

使用上述代码,可以将处理结果保存在一个列表中,最后再将所有的结果写入文件。这样就可以处理所有的csv文件了。

Python CSV 文件批量处理:计算电导率并保存结果

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

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