如何读取文本文件中的值并计算值重复的次数,然后查找平均值?

时间:2017-08-23 23:34:02

标签: python pandas dataframe

我有一个名为text.txt的文本文件,如下所示:

5.H6 7.891 0.3
6.H6 7.693 0.3
7.H8 8.16859 0.3
8.H6 7.446 0.3
5.H6 7.72158 0.3
9.H8 8.1053 0.3
8.H6 7.65014 0.3
10.H6 7.54 0.3
12.H6 8.067 0.3
13.H6 8.047 0.3
14.H6 7.69624 0.3
6.H6 7.70272 0.3
17.H8 7.169 0.3
16.H8 8.27957 0.3
18.H6 7.385 0.3
19.H8 7.657 0.3
20.H8 7.78512 0.3
21.H8 8.06057 0.3

我想创建一个新的输出文本文件,如下所示:

 Atom nVa  predppm   avgppm    
  7.H2   2   7.674   7.853    
  9.H2   2   7.434   7.458    
  20.H2  2   7.602   7.898   
  21.H2  1   7.959   7.898   
  8.H1'  1   5.363   5.238   

基本上我想读取text.txt中的值并查看第一列中的值是否重复。例如,5.H6中的text.txt在第1行和第5行中重复。5.H6的第二列中的值为7.891和7.72158,我想计算它们的平均值并将它们放入我的示例输出文件中avgppm下的输出文件中的一列。另外,在我的示例输出文件的第二列中,名为nVa我想计算text.txt的第一列中的值重复多少次。例如,5.H6重复两次,因此Atom 5.H6的第二列应为2。

现在,我只是尝试编码以从我的示例输出文件中获取第一,第二和第四列。但是稍后我想在我的文件中添加单独的列,例如predppmstdevdelta等。

这是我目前的代码:

import pandas as pd

filename = 'text.txt'
df = pd.read_csv(filename,sep = r'/s+', header = None)
df[df.duplicated([' '], keep=False)]
df.sum(axis=1) / len(df.columns)


df.to_csv("output.txt",sep = r'/s+',header=None)

我不确定如何继续,我无法测试我的代码,因为我不断收到错误。

编辑:错误

  gb = (df.groupby("Atom", as_index=False).agg({"ppm":["count","mean"]}).rename(columns={"count":"nVa", "mean":"avgppm"}))
  File "/Library/Python/2.7/site-packages/pandas-0.20.3-py2.7-macosx-10.11-intel.egg/pandas/core/generic.py", line 4416, in groupby
**kwargs)
  File "/Library/Python/2.7/site-packages/pandas-0.20.3-py2.7-macosx-10.11-intel.egg/pandas/core/groupby.py", line 1699, in groupby
return klass(obj, by, **kwds)
  File "/Library/Python/2.7/site-packages/pandas-0.20.3-py2.7-macosx-10.11-intel.egg/pandas/core/groupby.py", line 392, in __init__
mutated=self.mutated)
  File "/Library/Python/2.7/site-packages/pandas-0.20.3-py2.7-macosx-10.11-intel.egg/pandas/core/groupby.py", line 2690, in _get_grouper
raise KeyError(gpr)
KeyError: 'Atom'

1 个答案:

答案 0 :(得分:0)

df为:

     Atom      ppm  unclear
0    5.H6  7.89100      0.3
1    6.H6  7.69300      0.3
2    7.H8  8.16859      0.3
3    8.H6  7.44600      0.3
4    5.H6  7.72158      0.3
5    9.H8  8.10530      0.3
6    8.H6  7.65014      0.3
7   10.H6  7.54000      0.3
8   12.H6  8.06700      0.3
9   13.H6  8.04700      0.3
10  14.H6  7.69624      0.3
11   6.H6  7.70272      0.3
12  17.H8  7.16900      0.3
13  16.H8  8.27957      0.3
14  18.H6  7.38500      0.3
15  19.H8  7.65700      0.3
16  20.H8  7.78512      0.3
17  21.H8  8.06057      0.3

使用groupby()按照Atom收集信息,然后根据需要应用聚合功能:

gb = (df.groupby("Atom", as_index=False)
        .agg({"ppm":["count","mean"]})
        .rename(columns={"count":"nVa", "mean":"avgppm"}))
gb.head()
     Atom ppm         
          nVa   avgppm
0   10.H6   1  7.54000
1   12.H6   1  8.06700
2   13.H6   1  8.04700
3   14.H6   1  7.69624
4   16.H8   1  8.27957

这提供了分组和聚合的工作流程,但它并不完全符合您的要求。我们可以删除多级列结构,尽管计算您感兴趣的值并不是绝对必要的:

gb.columns = gb.columns.droplevel()
gb = gb.rename(columns={"":"Atom"})

     Atom  nVa   avgppm
0   10.H6    1  7.54000
1   12.H6    1  8.06700
2   13.H6    1  8.04700
3   14.H6    1  7.69624
4   16.H8    1  8.27957
5   17.H8    1  7.16900
6   18.H6    1  7.38500
7   19.H8    1  7.65700
8   20.H8    1  7.78512
9   21.H8    1  8.06057
10   5.H6    2  7.80629
11   6.H6    2  7.69786
12   7.H8    1  8.16859
13   8.H6    2  7.54807
14   9.H8    1  8.10530

请参阅groupby()文档以获得完整的处理。