如何读取两个文件,插入新的列,以及计算函数,如mean,如果有空值?

2024-09-27 07:29:41 发布

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

我有一个名为'test.txt'的文件,它看起来像这样:

3.H5 5.40077
2.H8 7.75894
3.H6 7.60437
3.H5 5.40001
5.H5 5.70502
4.H8 7.55438
5.H1' 5.43574
5.H6 7.96472
""
""
""
""
""
""
6.H6 7.96178
6.H5 5.71068
""
""
7.H8 8.29385
7.H1' 6.01136
""
""
""
""
8.H5 5.51053
8.H6 7.67437

我想看看第一列中的值是否相同(即:如果8.H5出现了多次),如果相同,我想计算出它们的平均值。我希望我的输出如下所示:

 Atom  nVa  predppm   avgppm    stdev    delta    QPred   QMulti   qTotal
 1.H1'   1    5.820    5.737    0.000    0.000    0.985    1.000    0.995
 2.H1'   1    5.903    5.892    0.000    0.000    0.998    1.000    0.999
 3.H1'   1    5.549    5.454    0.000    0.000    0.983    1.000    0.994
 4.H1'   1    5.741    5.737    0.000    0.000    0.999    1.000    1.000
 6.H1'   1    5.543    5.600    0.000    0.000    0.990    1.000    0.997
 8.H1'   1    5.363    5.359    0.000    0.000    0.999    1.000    1.000
10.H1'   1    5.378    5.408    0.000    0.000    0.995    1.000    0.998
11.H1'   1    5.501    5.497    0.000    0.000    0.999    1.000    1.000
14.H1'   1    5.962    5.893    0.000    0.000    0.988    1.000    0.996

现在,我的代码从test.txt读取并计算值的计数和平均值,并给出如下输出(output.txt):

Atom  nVa    avgppm    
1.H1'   1     5.737    
2.H1'   1     5.892   
3.H1'   1     5.454    
4.H1'   1     5.737    
6.H1'   1     5.600    

但是它不考虑""行,如何让代码跳过有""行的行

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

5.H6 7.72158 0.3
6.H6 7.70272 0.3
7.H8 8.16859 0.3
8.H6 7.65014 0.3
9.H8 8.1053 0.3
10.H6 7.5231 0.3
12.H6 7.72805 0.3
13.H6 8.02977 0.3
14.H6 7.69624 0.3
17.H8 7.24899 0.3
16.H8 8.27957 0.3
18.H6 7.6439 0.3
19.H8 7.65501 0.3
20.H8 7.78512 0.3
21.H8 8.06057 0.3
22.H8 7.47677 0.3
23.H6 7.7306 0.3
24.H6 7.80104 0.3

我想读入test.txt的第一列的值和test2.txt的第一列的值,看看它们是否相同(即:如果20.H8=20.H8),如果相同,我想在output.txtnVa列和avgppm列之间插入一列,然后输入test2.txt的值。如何通过不使用这些行,将一个列插入到输出文件中,这也解释了空白空间?

这是我当前的代码:

import pandas as pd
import os
import sys

test = 'test.txt'
test2 = 'test2.txt'


df = pd.read_csv(test, sep = ' ', header = None)
df.columns = ["Atom","ppm"]
gb = (df.groupby("Atom", as_index=False)
        .agg({"ppm":["count","mean"]})
        .rename(columns={"count":"nVa", "mean":"avgppm"}))
gb.head()
gb.columns = gb.columns.droplevel()
gb = gb.rename(columns={"":"Atom"})
gb.to_csv("output.txt", sep =" ", index=False)

df2 = pd.read_csv(test2, sep = r'/s+', header = None)
df2.columns = ["Atoms","ppms","error"]

shift1 = df2["Atoms"]
shift2 = df2["ppms"]

我不太清楚该怎么办


Tags: columns文件代码testtxth1atomh5
2条回答

要删除以""作为值的行,请使用数据帧的dropna方法。您可以通过reset_index来重置行计数

df = pd.read_csv(test, sep = ' ', header = None)
df.columns = ["Atom","ppm"]
df = df.dropna().reset_index(drop=True)

gb = ...

要找到匹配的值,可以使用merge方法并比较感兴趣的列

df2 = pd.read_csv(test2, sep = r'/s+', header = None)
df2.columns = ["Atoms","ppms","error"]
gb.merge(df2, left_on='Atom', right_on='Atoms', how='left').drop(['Atoms','ppms'], axis=1)

如果gb中的值不在df2中,这将给您留下NA

左边的merge()应该能够按照您想要的方式将dfdf2组合在一起

df = pd.read_csv("test.txt", sep=" ", header=None, names=["Atom", "ppm"])
df2 = pd.read_csv("test2.txt", sep=" ", header=None, names=["Atom", "ppms", "error"])

gb = df.groupby("Atom").agg(["count", "mean"])
gb.merge(df2.set_index("Atom"), how="left", left_index=True, right_index=True)

       (ppm, count)  (ppm, mean)     ppms  error
Atom                                            
2.H8              1      7.75894      NaN    NaN
3.H5              2      5.40039      NaN    NaN
3.H6              1      7.60437      NaN    NaN
4.H8              1      7.55438      NaN    NaN
5.H1'             1      5.43574      NaN    NaN
5.H5              1      5.70502      NaN    NaN
5.H6              1      7.96472  7.72158    0.3
6.H5              1      5.71068      NaN    NaN
6.H6              1      7.96178  7.70272    0.3
7.H1'             1      6.01136      NaN    NaN
7.H8              1      8.29385  8.16859    0.3
8.H5              1      5.51053      NaN    NaN
8.H6              1      7.67437  7.65014    0.3

注意:对于df中缺少的行,似乎甚至不需要dropna()read_csv()""值解释为NaN,分组时groupby()忽略NaN

相关问题 更多 >

    热门问题