如何在大熊猫中读取并平均取多个表文件?

时间:2018-08-01 14:21:38

标签: python pandas

这就是两个表的样子

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行。那么我如何才能根据表中的第一列取行的平均值呢?

1 个答案:

答案 0 :(得分:3)

将所有文件连接到单个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()    

根据您的评论,您可以首先对DataFrame进行排序,以便首先出现最高的值,然后删除重复项,从而仅留下stlines最高值的行,每个{{ 1}}。只需将循环更改为:

wave