Я пишу небольшую функцию для выбора строк из файла .xlsx, считывая его как pandas dataframe и просматривая его с помощью метода .iterrows (). Каждая строка имеет тип pandas.core.series.Series
. Теперь я хочу выполнить серию булевых проверок, чтобы увидеть, есть ли в этом элементе (1002 *) определенные элементы (совпадающая строка, определенное числовое значение и т. Д. c.). Как я обычно делаю это в простом встроенном синтаксисе, просто спрашиваю: if item in container: do X
, но я обнаружил, что это работает только на list
типах, что я понял, преобразовав строку в список python, используя список ( ) функция. Поэтому я хотел знать, есть ли для этого собственный метод / функция pandas, или я должен просто использовать свое текущее исправление (мое текущее исправление находит длину двух объектов set (), что, как я полагал, будет много быстрее, чем преобразование в списки).
Это важно для меня, так как мне хотелось бы заранее знать, как оптимизировать работу для предварительного исполнения. В последнее время я сталкиваюсь с множеством проблем из-за плохой производительности, хотя у меня довольно сильная система (CPU: Ryzen 7 3700X). Однажды мне может понадобиться l oop через несколько гигантов c .csv, выполняющих те же самые операции, и если я не согласен на использование JIT-компилятора (который я не знаю в целом), это может занять много лет. Итак: есть ли собственный метод pandas, чтобы сделать это, и будет ли он преформироваться лучше, чем мое текущее решение?
Вот выдержка из .xlsx (возможно, больше, чем необходимо):
solute qqType waterModel chargeMethod qmTheory qmBasis NumericalValues
Ammonia fixed SPCE mbis B3LYP cc-pVTZ 1
Ammonia OTFP SPCE mbis B3LYP cc-pVTZ 1
Ammonia fixed SPCE mbis MP2 cc-pVTZ 1
Ammonia OTFP SPCE mbis MP2 cc-pVTZ 1
Ammonia fixed SPCE resp B3LYP cc-pVTZ 1
Ammonia OTFP SPCE resp B3LYP cc-pVTZ 1
Ammonia fixed SPCE resp HF 6-31G* 1
Ammonia OTFP SPCE resp HF 6-31G* 1
Ammonia fixed SPCE bcc AM1 - 1
Ammonia OTFP SPCE bcc AM1 - 1
Ammonia fixed TIP3P resp HF 6-31G* 1
Ammonia OTFP TIP3P resp HF 6-31G* 1
Ammonia fixed TIP3P resp B3LYP cc-pVTZ 1
Ammonia OTFP TIP3P resp B3LYP cc-pVTZ 1
Ammonia fixed TIP3P bcc AM1 - 1
Ammonia OTFP TIP3P bcc AM1 - 1
1
ACETAMIDE fixed SPCE mbis B3LYP cc-pVTZ 1
ACETAMIDE OTFP SPCE mbis B3LYP cc-pVTZ 1
ACETAMIDE fixed SPCE mbis MP2 cc-pVTZ 1
ACETAMIDE OTFP SPCE mbis MP2 cc-pVTZ 1
ACETAMIDE fixed SPCE resp B3LYP cc-pVTZ 1
ACETAMIDE OTFP SPCE resp B3LYP cc-pVTZ 1
ACETAMIDE fixed SPCE resp HF 6-31G* 1
ACETAMIDE OTFP SPCE resp HF 6-31G* 1
ACETAMIDE fixed SPCE bcc AM1 - 1
ACETAMIDE OTFP SPCE bcc AM1 - 1
ACETAMIDE fixed TIP3P resp HF 6-31G* 1
ACETAMIDE OTFP TIP3P resp HF 6-31G* 1
ACETAMIDE fixed TIP3P resp B3LYP cc-pVTZ 1
ACETAMIDE OTFP TIP3P resp B3LYP cc-pVTZ 1
ACETAMIDE fixed TIP3P bcc AM1 - 1
ACETAMIDE OTFP TIP3P bcc AM1 - 1
А вот мой код:
import pandas as pd
df = pd.read_excel('SI.xlsx')
def Extractor(dataframe,*match_criteria):
for index,row in dataframe.iterrows():
if len(set(row) & set(match_criteria)) == len(match_criteria):
yield row
for occurence in Extractor(df,'OTFP','resp'):
print(occurence)