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

Python 如何调用需要使用文本文件中的值的函数?,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个职能: 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 我有

我有两个职能:

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.40077
5.40001
的平均值,并将其用作我的
getQMulti
程序中的
peakAvg
。本例中的平均值为5.40039,
ppm
值为
5.40077
5.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)

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

with open('expAtoms.txt') as file:
    for line in file:
        # To get each column value, use split()
        left, right = line.split(" ")
请记住,这是假定列由空格分隔的。从那里,我将把值保存在字典中,以便将来在查找左侧值匹配的行时检查它们(这一步有很大的优化空间,但这是一个单独的问题)。

尝试以下方法:

将熊猫作为pd导入
df=pd.read_表(“path/to/your_file.txt”,delimiter=”“,header=None)
rename(列={0:“原子”,1:“值”},inplace=True)
>>>df
出[1]:
原子值
0.3.H5.40077
1.2.H8 7.75894
2.3.H6 7.60437
3.3.H5.40001
4.5.H5.70502
5.H6 7.96472
6楠楠楠
7楠楠
8.6.H6 7.96178
9.6.H5.71068
>>>df.groupby('atom').value.mean()
出[2]:
原子
2.H8 7.75894
3.H5 5.40039
3.H6 7.60437
5.H5.70502
5.H6 7.96472
6.H5 5.71068
6.H6 7.96178
名称:value,数据类型:float64
注意,这段代码期望您的文件只包含表,而不包含头或任何其他内容

如果要提取特定值,请执行以下操作:

ppm=df.where(df.atom==“3.H5”).value.dropna()
peakAvg=ppm.mean()
但是您可能应该将函数更改为添加
peakAvg
作为参数,以便将值传递给函数

def getQMulti(ppm、peakAvg、errorLim):
x=(ppm峰值)/errorLim
q=getQ(x)
x0=2.0
q0=getQ(x0)
QMulti=1.0+(q/math.abs(q0))
返回QMulti

编辑:

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

df.atom.unique()中原子的
迭代所有原子
ppm=df.where(df.atom==atom.value.dropna()
peakAvg=ppm.mean()
#在这里运行你的函数

但是请注意,您的函数必须处理类似数组的结构,因此您可能必须使用
numpy
而不是
math

来实现它,带引号的行(
)代表什么?它们不代表任何内容,这些行是我不想使用的NaN行,可能使用csv模块,将每一行作为列表中的一个项目放入列表中;对第一列上的列表进行排序,使用itertools.groupby生成第一列相同的所有值;取每组值的平均值并使用它。你的问题如何不被回答???你问题的标题不能反映你的问题。这将在带有引号的行中失败
,因此我将添加一个
if
语句来过滤这些内容谢谢!我试过了,但是我得到了一个语法错误,它说:
SyntaxError:keyword不能是一个表达式,当它谈论
ppm=df.where(df.atom==“3.H5”).value.dropna()
时,我如何运行它而不指定
3.H5
,并且只运行所有的值,例如,当我调用
getQMulti
时,它会遍历所有原子名称(即:
3.H5
),找到它的平均值,并使用与之相关的两个ppm值(即:5.40077和5.40001)来计算getQMulti如何使用numpy而不是数学来实现它?numpy是否有类似于
erf
的函数?我刚刚试用了你的代码,我得到了如下错误:
AttributeError:“DataFrame”对象没有属性“atom”
这是你说我会得到的错误,因为我没有用numpy实现我的函数吗?@user8290579:numpy应该有除
erf
但是您会在
scipy.special.erf
下找到一个类似的函数,它应该可以正常工作。关于您的AttributeError,能否检查
df
的第一列是否为“atom”?这段代码适合我,所以我不确定错误来自哪里。