Моя цель - объединить два столбца в третий столбец «Приоритет» (шаг 1) .Далее я считаю каждый экземпляр объединенных значений в новом столбце «Приоритет» (шаг 2) .Затем я отфильтровываю случаи, когда объединенное значение, то есть «Приоритет», было 1 (шаг 3) .Затем я удаляю каждую строку, которая была отменена в столбце «WO_Stat», если общее количество значений для столбца, созданного нами (шаг 2), больше 1 (шаг 4) .
Я считаю, что предыдущие шаги я сделал правильно;в моих комментариях к коду я прокомментировал, где я заблудился "#above, это работало нормально, 9.24, но я не уверен, если это имеет смысл, также нужно работать ниже".
Мне нужна большая помощь на шаге ниже.
Шаг 5 Для значений в «Приоритете», число которых превышает 1, удалите строки, в которых их «Order_Qty» меньше 16, только если считалось, что тот же «Приоритет»значение 'имеет другое значение' Order_Qty ', превышающее 99. (учтите, что для каждого "значения приоритета" может быть до 10 отсчетов, так что вы, возможно, удаляете только 4, если, скажем, Order_Qty было 10,10,9,8,2000,2000,2000,4000,3000,300)
Если вы не можете помочь с логикой, даже просто помогаете ускорить выполнение этого кода, это займет почти час с 40 тыс. Строк данных.Может быть, я мог бы включить динамическое программирование или формат данных столбца лучше?
import pandas as pd
import numpy as np
from numpy import NaN
df = pd.read_excel("ors_final.xlsx", encoding = "ISO-8859-1", dtype=object) #used to read xls file named vlookuped but now changed to ors_final as of 2.20.19
df['Priority']= df['Priority'].astype('str')
df['Cust_PO_Number']= df['Cust_PO_Number'].astype('str')
df['Cust_PO_Number']= df['Cust_PO_Number'].astype('str')
df['Item_Number']= df['Item_Number'].astype('str')
df['Sub_Priority']= df['Sub_Priority'].astype('str')
# creating second df
df_deleted = df.copy(deep=True)
df_deleted.drop(df.index,inplace=True)
# creating variable for small value first art
LOWER_THRESHOLD = 16
#
print("1. combine po number and item number")
for i, row in df.iterrows(): #iterate through each row with with row value and row content
a = str(row['Cust_PO_Number'])
b = str(row['Item_Number'])
concat = a + b
df.set_value(i, 'Priority', concat)
#worked 9.23
print('2. Count all the duplicates of the combined values above')
seen = {}
for i, row in df.iterrows(): # now we will count the combined values, not dict keys cant have dupe values
c = row['Priority']
if c not in seen: # have not seen the letter before, we need to establish this
seen [c] = 0
seen[c] += 1 # Seen concatted values once, add one.
for i, row in df.iterrows(): #put the recorded numbers in, now we loop thorugh each row to get the value of c to call it as it's key (dict) value
c = row['Priority']
times_seen = seen[c]
df.set_value(i, 'Mfg_Co', times_seen)
print("3. Ignore instances of rowes where concat is not one")
for i, row in df.iterrows():
d = row['Mfg_Co']
if d == 1.0:
df.set_value(i,'Sub_Priority',True)
else:
df.set_value(i,'Sub_Priority',False)
print('4. Delete all rows where orders are cancelled but concated column is more than 1')
delete_these = []
for i, row in df.iterrows():
f = row['WO_Stat']
d = row['Sub_Priority']
if str(f) == 'Cancelled' and d != True:
delete_these.append(i)
df_deleted = df_deleted.append(row) # this does not append dataframe yet looking into 9.23
df.drop(delete_these, axis=0, inplace=True)
#above this was working 9.24 but had not tested the data integrity , looked pretty good tho
over_numbers = {}
for i, row in df.iterrows(): #determine if its over a number, still working out kinks 9.24
c = row['Priority']
g = row['Order_Qty']
if float(g) > float(99):
over_numbers[c] = True
#little confused on below on
print('step 5')
for i, row in df.iterrows(): # storing the numbers over 99
c = row['Priority']
if c in over_numbers:
df.set_value(i, 'Comments_Status',True)
else:
df.set_value(i,'Comments_Status',False)
#above, this was working fine 9.24 but not sure if it makes sense, also need to work on below
##
delete_these = []
for i, row in df.iterrows(): # Remove all rows that have over_number = True and also number less than 16
d = row['Sub_Priority'] # should this be changed?
f = row['Comments_Status']
if d <= LOWER_THRESHOLD and f is True: # so grouping 1st arts
delete_these.append(i) # store row number to drop later
df_deleted = df_deleted.append(row) # Add the row to other dataframe
df.drop(delete_these, axis=0, inplace=True)
#step 5 was not working as of 10.2, it was breaking out the first article data wrong
writer = pd.ExcelWriter('1start.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')
writer.save()
writer = pd.ExcelWriter('deleted1start.xlsx', engine='xlsxwriter')
df_deleted.to_excel(writer, sheet_name='Sheet1')
writer.save()
--- Новый формат вопроса, с попыткой облегчить понимание / помочь ---
import pandas as pd
df = pd.DataFrame({'Column_A':['test1', 'test7', 'test7', 'test4', 'test6', 'test6', 'test7'],'Column_B':['WO1','WO7', 'WO7', 'WO6', 'WO6', 'WO6', 'WO7'],
'Column_A_B': ['','','','','','','',], 'Satus': ['Cancelled','Cancelled', 'Active', 'Active', 'Open', 'Active', 'Active'],
'Qty': ['12', '34' , '13', '3000', '14', '88', '1500']})
Пожалуйста, посмотрите пример DataFrame выше и мои пошаговые цели: Шаг 1: Объедините столбец A и столбец B в Column_A_B Шаг 2: Подсчитайте каждый экземплярзначения в 'ColumnA_B' Шаг 3 Отфильтровать строки, в которых есть только 1 экземпляр значения в 'ColumnA_B' Шаг 4: Удалить каждую строку, которая была отменена в столбце 'Status'и только строка, которая была отменена в нем - могут быть некоторые с тем же значением в ColumnA_B, но с разными значениями «Status» (обратите внимание, что при применении фильтра третьего шага) Step 5: с фильтромпо-прежнему для 'Column_A_B' (т. е. для счетчика фильтрации 1) посмотрите на избыточные значения (поэтому при подсчете значений в 'Column_A_B_' будет 2 или больше), а затем для упомянутых сгруппированных подсчетов посмотрите на 'QТы колонка.Если у этой группы Qty меньше 16, а более 99, удалите только строку, у которой было «QTY» из 16. Если в группе было «QTY из всех менее 99, ничего не удаляйте, если все значения« QTY »более 99 не удаляйте ничего.
Результат Df этой логики будет следующим:
import pandas as pd
goaldf = pd.DataFrame({'Column_A':['test1', 'test4', 'test6', 'test6', 'test7'],'Column_B':['WO1', 'WO6', 'WO6', 'WO6', 'WO7'],
'Column_A_B': ['test1W01','test4WO6','test6WO6','test6WO6', 'test7WO7'], 'Satus': ['Cancelled', 'Active', 'Open', 'Active', 'Active'],
'Qty': ['12', '3000', '14', '88', '1500']})