有没有一种简单的方法可以在熊猫数据框中找到元素的“坐标”?

时间:2020-09-28 12:46:28

标签: python pandas dataframe

我有一个数据框“ ptable”,看起来像这样:

A 188 x 32 dataframe of the periodic table containing varying types of data.

我们得到了一个非常简单的任务,即在数据框中找到一个值,即氩气的沸点。他们的示例解决方案就是简单地做到这一点(对于化学家来说,这是计算机科学中非常基础的课程):

print(ptable.loc[17, 'BoilingPoint'])

在我看来,这不是一个很好的解决方案,因为它需要知道您要查找的值的索引(在这种情况下,这很简单,因为它只是原子数减1,但将来可能会更乏味。

我试图编写一个快速函数,以使其更具前瞻性,或在类似的数据帧上工作:

def element_data(element, property):
    row = (ptable.index[ptable['Element'] == element])[0]
    #column = ptable.columns.get_loc(property)
    print(ptable.loc[row, property])
element_data('Argon', 'BoilingPoint')

这很好用,但是只能在这个特定的数据帧上工作,并且我对查找行的索引的实现不满意,因为它看起来很不雅致。我还想知道是否有一个熊猫函数,可以使用注释掉的“ column”变量。

理想的函数应该能够将元素用作原子序号,名称或符号,并产生任何要求的属性。

是否有更好的方法来解决此问题,从而不需要对数据帧的结构有深入的了解?

2 个答案:

答案 0 :(得分:1)

这是我的解决方案:

import pandas as pd

def locate(data, query, value, output):
    df = pd.DataFrame(data = data)
    # create a list of values in the query (column)
    values = df[query].tolist()
    row = 0
    if value in values:
        row = values.index(value)
    return df.loc[row, output]

输入数据如下所示:

d = {
    'AtomicNumber': [1, 2, 3, 4, 5],
    'Element': ['Hydrogen', 'Helium', 'Lithium', 'Beryllium', 'Boron'],
    'Symbol': ['H', 'He', 'Li', 'Be', 'B'],
    'BoilingPoint': [20.28, 4.22, 1615.00, 2742.00, 4200.00],
}

value = locate(data=d, query='Symbol', value='He', output='BoilingPoint')

输出:

4.22

查询基本上是您传递值所在的列。例如,我将查询指定为“ Symbol”,然后传入该查询下的值(“ He”)。输出只是您希望输出为哪种数据类型。我想要He的沸点,所以传入“ BoilingPoint”作为输出参数。

当然,您也可以这样调用函数,而无需显式编写参数。

locate(d, 'Symbol', 'He', 'BoilingPoint')

但是,由于所有参数彼此相似,因此,如果您明确设置每个参数,可读性就会提高。

答案 1 :(得分:0)

我认为gmdev solution更好,但我想指出的是,这种查询有一种pandas.query语法。

d = {
    'AtomicNumber': [1, 2, 3, 4, 5],
    'Element': ['Hydrogen', 'Helium', 'Lithium', 'Beryllium', 'Boron'],
    'Symbol': ['H', 'He', 'Li', 'Be', 'B'],
    'BoilingPoint': [20.28, 4.22, 1615.00, 2742.00, 4200.00],
}
df = pd.DataFrame(d)

df.query('Element == "Helium"')['BoilingPoint']

出局:

1    4.22
Name: BoilingPoint, dtype: float64