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”?这段代码适合我,所以我不确定错误来自哪里。