我有两个功能:
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
的平均值,并将其用作peakAvg
程序中的getQMulti
。此示例中的平均值为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)
答案 0 :(得分:1)
试试这个:
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
来实现它。
答案 1 :(得分:0)
您可以使用以下简单的行逐行读取文件:
with open('expAtoms.txt') as file:
for line in file:
# To get each column value, use split()
left, right = line.split(" ")
请记住,这假设列由空格分隔。从那里我将值保存在字典中,因此您可以在将来查找左侧值匹配的行时检查它们(此步骤有很多优化空间,但这是一个单独的问题)