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

问题描述

我有一个数据框“ptable”,如下所示:

周期表的 188 x 32 数据帧,包含不同类型的数据。

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

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

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

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

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')

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

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

有没有更好的方法来解决这个问题,这样就不需要对数据框结构的深入了解?

标签: pythonpandasdataframe

解决方案


这是我的解决方案:

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')

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


推荐阅读