python - 访问 pandas dataframe 的正确方法

标签 python pandas pvlib

我正在尝试从 pvlib 访问的 CEC 数据库访问/创建模块名称列表:

import pandas as pd
import pvlib as pv

cecmod = pv.pvsystem.retrieve_sam('CECMod')

我想搜索模块名称列表:

matching = [s for s in dir(cecmod) if "Trina" in s]

dir(cecmod)部分让我烦恼。我偶然发现了这种获取数据框列标题(键?)列表的方法,但我感觉 dir不应该这样使用。为什么 dir(pandas.DataFrame)返回此列标题列表而不是 ?这是数据框的使用方式吗?有更好的方法来访问这些标题/键吗?

最佳答案

不,这真是糟糕的设计。 dir(..) 旨在列出对象的所有属性。尽管这并不总是可能的,因为某些对象会动态生成属性。

使用 if "Trina"in s 检查也是一个坏主意,因为最终可能会发生搜索字符串位于属性中的情况。

获取列列表的一种方法是使用cecmode.columns。这是一个 Index(..) 对象,例如:

>>> cecmod.columns
Index(['BEoptCA_Default_Module', 'Example_Module', '1Soltech_1STH_215_P',
       '1Soltech_1STH_220_P', '1Soltech_1STH_225_P', '1Soltech_1STH_230_P',
       '1Soltech_1STH_235_WH', '1Soltech_1STH_240_WH', '1Soltech_1STH_245_WH',
       '1Soltech_1STH_FRL_4H_245_M60_BLK',
       ...
       'Zytech_Solar_ZT275P', 'Zytech_Solar_ZT280P', 'Zytech_Solar_ZT285P',
       'Zytech_Solar_ZT290P', 'Zytech_Solar_ZT295P', 'Zytech_Solar_ZT300P',
       'Zytech_Solar_ZT305P', 'Zytech_Solar_ZT310P', 'Zytech_Solar_ZT315P',
       'Zytech_Solar_ZT320P'],
      dtype='object', length=13953)

它是可迭代的,然后我们迭代列名:

matching = [col for col in cecmod.columns if "Trina" in col]

这将产生:

>>> [col for col in cecmod.columns if "Trina" in col]
['Trina_Solar_TSM_165DA01', 'Trina_Solar_TSM_170D', 'Trina_Solar_TSM_170DA01', 'Trina_Solar_TSM_170DA03', 'Trina_Solar_TSM_170PA03', 'Trina_Solar_TSM_175D', 'Trina_Solar_TSM_175DA01', 'Trina_Solar_TSM_175DA03', 'Trina_Solar_TSM_175PA03', 'Trina_Solar_TSM_180D', 'Trina_Solar_TSM_180DA01', 'Trina_Solar_TSM_180DA03', 'Trina_Solar_TSM_180PA03', 'Trina_Solar_TSM_185DA01', 'Trina_Solar_TSM_185DA01A', 'Trina_Solar_TSM_185DA01A_05', 'Trina_Solar_TSM_185DA01A_08', 'Trina_Solar_TSM_185DA03', 'Trina_Solar_TSM_185PA03', 'Trina_Solar_TSM_190DA01A', 'Trina_Solar_TSM_190DA01A_05', 'Trina_Solar_TSM_190DA01A_08', 'Trina_Solar_TSM_190DA03', 'Trina_Solar_TSM_190PA03', 'Trina_Solar_TSM_195DA01A', 'Trina_Solar_TSM_195DA01A_05', 'Trina_Solar_TSM_195DA01A_08', 'Trina_Solar_TSM_200DA01A', 'Trina_Solar_TSM_200DA01A_05', 'Trina_Solar_TSM_200DA01A_08', 'Trina_Solar_TSM_205DA01A', 'Trina_Solar_TSM_205DA01A_05', 'Trina_Solar_TSM_205DA01A_08', 'Trina_Solar_TSM_220DA05', 'Trina_Solar_TSM_220PA05', 'Trina_Solar_TSM_220PA05_05', ...

(输出被切断)。

我们还可以使用 .str.contains('Trina') 执行更快的匹配,就像 @DYZ 所说的:

list(cecmod.columns[cecmod.columns.str.contains('Trina')])

这里我们让库来完成搜索工作,这通常会优于 Python 循环。

或者,使用 str.startswith,假设搜索字符串位于列名称的开头:

list(cecmod.columns[cecmod.columns.str.startswith('Trina')])

如果您想要数据框,而不仅仅是列名称,请使用df.filter:

df.filter(like='Trina')

关于python - 访问 pandas dataframe 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48362325/

相关文章:

python-3.x - ValueError : Expected 2D array, 得到的是一维数组。 Python 线性回归函数

python - PVLIB - 如何使用耦合逆变器正确定义系统规模

python反斜杠正则表达式的乐趣

python - 将具有不同数量参数的函数存储在字典中

python - 如何更改昵称 (discord.py)

python - 有没有办法在 pandas 数据框中显示分类自变量的回归系数?

python - 从一列复制字符串的一部分并将其放入新的 Pandas 列中

python - 使用 python pvlib 库时出现 SSL 证书错误

PVLIB:如何添加 CEC 和 SAM 库中不存在的模块和逆变器规范?

python - 将所有子图的 yaxis 设置为相同的范围 - Matplotlib