如何在pandas中读取和平均多个表文件?

2024-10-03 23:22:58 发布

您现在位置:Python中文网/ 问答频道 /正文

这就是两张桌子的样子

5113.440  1     0.25846     0.10166    27.96867     0.94852    -0.25846   268.29305     5113.434129
5074.760  3     0.68155     0.16566   120.18771     3.02654    -0.68155   101.02457     5074.745627
5083.340  2     0.74771     0.13267   105.59355     2.15700    -0.74771   157.52406     5083.337081
5088.150  1     0.28689     0.12986    39.65747     2.43339    -0.28689   164.40787     5088.141849
5090.780  1     0.61464     0.14479    94.72901     2.78712    -0.61464   132.25865     5090.773443

那是另一张桌子

5113.450  1     0.25846     0.10166    27.96867     0.94852    -0.25846   268.29305     5113.434129
5074.769  3     0.68155     0.16566   120.18771     3.02654    -0.68155   101.02457     5074.745627
5083.350  2     0.74771     0.13267   105.59355     2.15700    -0.74771   157.52406     5083.337081
5088.520  1     0.28689     0.12986    39.65747     2.43339    -0.28689   164.40787     5088.141849
5090.820  1     0.61464     0.14479    94.72901     2.78712    -0.61464   132.25865     5090.773443

我知道我能读懂它们,也能用下面的命令取它们的平均值:

df1 = pd.read_table("with_blaze.ares",skiprows=0,usecols=(0,1,2,3,4,8),names=['wave','num','stlines','fwhm','EWs','MeasredWave'],delimiter=r'\s+')
df2 = pd.read_table("without_blaze.ares",skiprows=0,usecols=(0,1,2,3,4,8),names=['wave','num','stlines','fwhm','EWs','MeasredWave'],delimiter=r'\s+')

df = df1 + df2

但是我有几百个这样的表格文件。所以我想知道怎样才能把它们一起读,然后取它们的平均值。而且所有文件中的行数都不相同,比如有些文件有600行,而有些文件只有540行。那么,如何根据表中的第一列计算行的平均值???你知道吗


Tags: 文件readnamestablewavenum平均值pd
1条回答
网友
1楼 · 发布于 2024-10-03 23:22:58

将所有文件连接到一个DataFrame中,然后使用wave值分组并计算平均值。你知道吗

import os
import pandas as pd

path_to_files = 'something'
lst = []
for filen in [x for x in os.listdir(path_to_files) if '.ares' in x]:
    lst.append(pd.read_table(path_to_files+filen, skiprows=0, usecols=(0,1,2,3,4,8),
                             names=['wave','num','stlines','fwhm','EWs','MeasredWave'],
                             delimiter=r'\s+'))
df = pd.concat(lst, ignore_index=True)

# Calculate the average based on the first column
df.groupby('wave').mean()    

根据您的注释,您可以首先对数据帧进行排序,使最高值首先出现,然后删除重复项,这样就只剩下stlines的每个唯一值的最高wave值所在的行。只需将循环更改为:

for filen in [x for x in os.listdir(path_to_files) if '.ares' in x]:
    df1 = pd.read_table(path_to_files+filen, skiprows=0, usecols=(0,1,2,3,4,8),
                        names=['wave','num','stlines','fwhm','EWs','MeasredWave'],
                        delimiter=r'\s+'))
    df1 = df1.sort_values('stlines', ascending=False).drop_duplicates('wave')
    lst.append(df1)

相关问题 更多 >