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

时间:2017-08-28 17:08:40

标签: 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

我有一个名为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的平均值,并将其用作peakAvg程序中的getQMulti。此示例中的平均值为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)

2 个答案:

答案 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(" ")

请记住,这假设列由空格分隔。从那里我将值保存在字典中,因此您可以在将来查找左侧值匹配的行时检查它们(此步骤有很多优化空间,但这是一个单独的问题)