#python #pandas #анализ данных #excel
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++.
Преимущество этого способа является подходящим для анализа данных. В этом примере я использовал функцию запроса по элементам списка.
В заключение хотелось бы сказать, что Pandas, при работе с большими объемами данных, является большой альтернативой Excel.
Читайте также: