首页 > 解决方案 > 熊猫:按循环数计算每行的平均值

问题描述

我有一个 CSV 文件(Mspec 数据),看起来像这样:

#Header
#
"Cycle";"Time";"ms";"mass amu";"SEM c/s"
0000000001;00:00:01;0000001452;     1,00;       620
0000000001;00:00:01;0000001452;     1,20;      4730
0000000001;00:00:01;0000001452;     1,40;      4610
...       ;..:..:..;..........;.........;...........

我通过以下方式阅读:

 df = pd.read_csv(Filename, header=30,delimiter=';',decimal= ',' )

结果如下所示:

      Cycle      Time      ms  mass amu  SEM c/s
0         1  00:00:01    1452       1.0      620
1         1  00:00:01    1452       1.2     4730
2         1  00:00:01    1452       1.4     4610
...     ...       ...     ...       ...      ...
3872      4  00:06:30  390971       1.0    32290
3873      4  00:06:30  390971       1.2    31510

该数据包含多个具有相同参数的质谱扫描。周期数 1 表示扫描 1,依此类推。我想计算每个相应相同质量的最后一列 SEM c/s 的平均值。最后我想有一个新的数据框只包含:

ms  "mass amu"  "SEM c/s(mean over all cycles)"

显然,不需要计算质量的平均值。我想避免将每个循环读入一个新的数据帧,因为这意味着我必须查找每个质谱的长度。对于不同的测量(Soluion),“质量范围”和“分辨率”明显不同。我想直接在 numpy 中进行计算是最好的,但我被卡住了?

先感谢您

标签: pythonpandasnumpy

解决方案


您在所有周期中都有不同的ms,并且您想计算每组相同ms的SEM平均值。我将向您展示一个分步示例。 您应该调用每个组,然后将平均值放入字典中以在 DataFrame 中进行转换。


ms_uni = df['ms'].unique()  #calculate the unique ms values
new_df_dict = { "ma":[],  "SEM":[] } #later you will rename them

for un in range( len(ms_uni) ):
    cms = ms_uni[un]
    new_df_dict['ma'].append( cms )
    new_df_dict['SEM'].append( df[ df['ms']==cms ]['SEM c/s'].mean() ) #advise: change the column name in a more safe SEM-c_s

new_df = pd.DataFrame(new_df_dict) #end of the dirty work
new_df.rename(index=str, columns={'ma':"mass amu", "SEM": "SEM c/s(mean over all cycles)"} )

希望它会有所帮助


推荐阅读