如何用Python仅导入CSV至Area列最小值处?代码无效求助
解决Langmuir槽实验数据截断问题:只保留压缩阶段到最小面积的数据
我看了你的代码和需求,问题主要出在两个地方:一是你用pandas处理了数据截断,但之后又用numpy.loadtxt重新读取了完整的原始数据,等于之前的截断操作完全没生效;二是你错误地用了idxmax()来找最小面积的位置,应该用idxmin()才对。
下面是修正后的完整代码,我会一步步解释关键改动:
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 1. 用pandas读取CSV数据,注意列名大小写要和文件里的一致(你的文件里是Area,不是area) df = pd.read_csv( "C:\\Users\\Owner\\Desktop\\Thunberg,Dametre\\5-29 Data and movies\\New folder (2)\\Data 2.csv", sep=',' ) # 2. 找到Area列最小值对应的行索引 min_area_idx = df['Area'].idxmin() # 3. 截断数据:只保留从开头到最小面积所在行(包括该行) truncated_df = df.iloc[:min_area_idx + 1] # 4. 从截断后的DataFrame中提取需要的数组 area = truncated_df['Area'].values pressure = truncated_df['Pressure'].values intensity = truncated_df['Intensity'].values # 5. 绘制双轴图表 fig, ax1 = plt.subplots() # 绘制面积-压力曲线 ax1.plot(area, pressure, label='Pressure', color='b') ax1.set_xlabel('Area', color='b') ax1.set_ylabel('Pressure', color='b') ax1.tick_params('y', colors='b') # 创建右侧y轴绘制面积-强度曲线 ax2 = ax1.twinx() ax2.plot(area, intensity, color='r', label='Intensity') ax2.set_ylabel('Intensity (measured by average pixel value)', color='r') ax2.tick_params('y', colors='r') # 添加标题和图例(合并两个轴的图例) fig.suptitle('Kibron Trough Pressure-Area-Intensity Graph') lines1, labels1 = ax1.get_legend_handles_labels() lines2, labels2 = ax2.get_legend_handles_labels() ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper right') plt.show()
关键改动说明:
- 统一数据读取方式:全程用pandas处理数据,避免重复读取原始文件。pandas的
iloc方法可以轻松按索引截断数据,比numpy更直观。 - 修正索引查找:用
df['Area'].idxmin()找到面积最小的行索引,而不是idxmax()(那是找最大面积的索引)。 - 合并图例:因为双轴图表的图例默认只显示当前轴的内容,所以需要手动合并两个轴的图例,让所有曲线标签都显示出来。
- 列名大小写匹配:确保代码里的列名
'Area'和CSV文件里的列名完全一致,避免找不到列的错误。
用你提供的示例数据测试的话,这段代码会自动截断到Area=3000的那一行,不会导入后面膨胀阶段的3500、4500等数据。
内容的提问来源于stack exchange,提问作者Dametre Thunberg
相关产品推荐
相关产品推荐

