Время прочтения: 3 мин.

Pandas, безусловно, является одним из основных инструментов, необходимых для работы с данными в Python. Он предлагает множество различных способов фильтрации фреймов данных. Один из них я сегодня покажу на примере.

Недавно подошла сотрудница с задачей — в файле нужно найти материалы на складах и сформировать файл для фильтрации по группам, чтобы можно удобно просмотреть в Excel. Количество материалов более 300 тысяч.

Пример:

При использовании библиотеки Левенштейна пришлось бы использовать цикл в цикле, при большом количестве данных проверка могла бы затянутся на долго. Анализ данных требует много операций фильтрации. Pandas предоставляют множество методов для фильтрации фрейма данных, и Dataframe.query() является одним из них.

import pandas as pd
pd.options.display.max_columns = None
      
mPath1=r"C:\Users\niki\Desktop\RACK"            
PATH =  mPath1+"\\Материалы.XLSX"
f1 = open((mPath1+ '\\1205_01_sort.csv'),mode="a", encoding="utf-8")
df = pd.read_excel(PATH,'Sheet1')

При загрузке файла в колонке Материала, все привел к верхнему регистру, удалил лишние пробелы и знаки

df['Lt'] = df['Material].str.replace('\W+',' ').str.replace('_',' ').str.strip().str.replace('  ',' ')
df['IND1']=0  
df['IND2']=0  
slist=df.iloc[0,4].split(' ')
kl=0
Col_text=2     # По двум текстам совпадения
Dl_text=2       # Кол-во символов в тексте
df['Lt'] = df['Lt'].fillna(' ')
while len(df)!=0:
    kl=kl+1
    kol=0
    ql=''
    df=df.loc[df['IND1']==0]
   if len(df.iloc[0,4])>=3:
        slist=df.iloc[0,4].split(' ')
        if len(slist)>1:
            for i in range(len(slist)):
                if len(slist[i])> Dl_text:
                    kol=kol+1
                    if kol<= Col_text:    # По двум текстам совпадения. При условии текст больше 2 символов
                        ql=ql+'and Lt.str.contains("'+slist[i]+'") '
        else:
            ql=ql+'and Lt.str.contains("'+slist[0]+'") ' 
# Формировалась строка ql для фильтрации датафрейма 
        
        if len(ql)>4:
            ql=ql[4:]
            ind_m = df.query(ql, engine='python').index
            df.at[ind_m, 'IND1'] = 1
            df.at[ind_m, 'IND2'] = kl
        for j in range(len(ind_m)): 
            sk1=df.loc[ind_m[j]][0]
            sk2=df.loc[ind_m[j]][2]
            sk3=df.loc[ind_m[j]][5]
            sk4=df.loc[ind_m[j]][6]

IND1 по умолчанию равен 0, после, если товар попадает под фильтр, получает значение 1.

IND2 (после фильтрации IND1) получает значение kol – это индекс для фильтрации в Excel, который используется в полученном файле

            sks='"'+str(sk1)+'";"'+str(sk2)+'";"'+str(sk3)+'";"'+str(sk4)+'"'
            f1.write(sks + '\n')
        print(kl,len(df))  
    else:
        df.iloc[0,5]=1
f1.close()    

Результат:

Теперь загрузив файл в Excel, можно сделать фильтрацию по колонке IND2. Сохранение в файл сделал по запросу сотрудника, чтобы видеть результат по заполнения файла в работе программы, файл можно просматривать в реальном времени либо с FAR, Notepad++. Программы доступны в SberUserSoft.

Преимущество этого способа является подходящим для анализа данных. В этом примере я использовал функцию запроса по элементам списка.

В заключение хотелось бы сказать, что Pandas, при работе с большими объемами данных, является большой альтернативой Excel.