如何调用需要使用文本文件中的值的函数?

2024-10-02 18:18:12 发布

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

我有两个功能:

errorLim = 0.3

def getQ(x):
    q = math.log(1.0- erf(abs(x)/SQRT2))
    return q

def getQMulti(ppm,errorLim):
    x = (ppm-peakAvg)/errorLim
    q = getQ(x)
    x0=2.0
    q0=getQ(x0)
    QMulti = 1.0+(q/math.abs(q0))
    return QMulti

我有一个名为expAtoms的文件,它是这样的:

3.H5 5.40077
2.H8 7.75894
3.H6 7.60437
3.H5 5.40001
5.H5 5.70502
5.H6 7.96472
""
""
6.H6 7.96178
6.H5 5.71068

如何将第一列中的值分组并查看它们是否相同,如果相同,则取第二列中值的平均值。例如3.H5重复,所以取5.400775.40001的平均值,并将其用作我的getQMulti程序中的peakAvg。本例中的平均值为5.40039,ppm值为5.400775.40001

import pandas as pd

expAtoms = 'expAtoms.txt'

df2 = pd.read_table(expAtoms,delimiter = " ", header = None)
df2.rename(columns={0:"atom",1:"value"}, inplace=True)
df2.groupby('atom').value.mean()

for atom in df.atom.unique():
    ppm = df.where(df.atom==atom).value.dropna()
    peakAvg = ppm.mean()

getQMulti(ppm,peakAvg,errorLim)

Tags: dfvaluedefmath平均值atomh5df2
2条回答

在Python中,您可以使用以下简单的位逐行读取文件:

with open('expAtoms.txt') as file:
    for line in file:
        # To get each column value, use split()
        left, right = line.split(" ")

请记住,这假设列由空格分隔。在那里,我将把这些值保存在字典中,以便将来在查找左侧值匹配的行时检查它们(这一步有很大的优化空间,但这是一个单独的问题)。你知道吗

试试这个:

import pandas as pd

df = pd.read_table("path/to/your_file.txt", delimiter=" ", header=None)
df.rename(columns={0: "atom", 1:"value"}, inplace=True)

>>> df
Out[1]:
   atom    value
0  3.H5  5.40077
1  2.H8  7.75894
2  3.H6  7.60437
3  3.H5  5.40001
4  5.H5  5.70502
5  5.H6  7.96472
6   NaN      NaN
7   NaN      NaN
8  6.H6  7.96178
9  6.H5  5.71068

>>> df.groupby('atom').value.mean()
Out[2]:
atom
2.H8    7.75894
3.H5    5.40039
3.H6    7.60437
5.H5    5.70502
5.H6    7.96472
6.H5    5.71068
6.H6    7.96178
Name: value, dtype: float64

请注意,此代码期望您的文件只包含表,而不包含头或其他任何内容。你知道吗

如果要提取特定值:

ppm = df.where(df.atom == "3.H5").value.dropna()
peakAvg = ppm.mean()

但是您可能应该更改您的函数以添加peakAvg作为参数,这样您就可以将值传递给函数。你知道吗

def getQMulti(ppm, peakAvg, errorLim):
    x = (ppm-peakAvg)/errorLim
    q = getQ(x)
    x0=2.0
    q0=getQ(x0)
    QMulti = 1.0+(q/math.abs(q0))
    return QMulti

编辑:

为了在所有值上迭代应用函数,如下所示:

for atom in df.atom.unique()  # iterate over all atoms
    ppm = df.where(df.atom == atom).value.dropna()
    peakAvg = ppm.mean()

    # Run your function here

但是请注意,您的函数必须处理类似数组的结构,因此您可能必须使用numpy而不是math来实现它。你知道吗

相关问题 更多 >