我有一个名为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。
现在,我只是尝试编码以从我的示例输出文件中获取第一,第二和第四列。但是稍后我想在我的文件中添加单独的列,例如predppm
,stdev
,delta
等。
这是我目前的代码:
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'
答案 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()
文档以获得完整的处理。