Здравствуйте, пожалуйста, просмотрите мой VBA-код, который работает.Я пытаюсь переписать его в Pandas, но мой сценарий Pandas не работает наполовину (Мой сценарий Pandas находится ниже VBA) Может ли кто-нибудь помочь мне закончить это, если это возможно (что я думаю, что это так)
Sub mymacro()
Columns(19).Replace "DFHD", "SFD"
Columns(19).Replace "DFBG", "SFD"
Columns(19).Replace "DFVD", "SFD"
Columns(19).Replace "MFUB", "BFD"
Columns(19).Replace "MFBD", "BFD"
Columns(19).Replace "DFBD", "BFD"
Columns(19).Replace "UFNC", "CFD"
Columns(19).Replace "UFNC", "CFD"
Columns(19).Replace "BFYD", "BFD"
'Having trouble starting below here'
Columns("T:AC").Select
Selection.EntireColumn.Hidden = True
ActiveSheet.Range("$A$1:$AS$1000000").AutoFilter Field:=19, Criteria1:=Array( _
"U*"), Operator:=xlFilterValues
ActiveWindow.SmallScroll Down:=-100
ActiveSheet.Range("$A$1:$AS$1000000").AutoFilter Field:=30, Criteria1:=Array( _
"350", "B*"), Operator:=xlFilterValues
ActiveWindow.SmallScroll Down:=-100
Range("S3").Select
ActiveCell.FormulaR1C1 = "BD"
Range("S3").Select
Selection.Copy
Range(Selection, Selection.End(xlDown)).Select
ActiveSheet.Paste
Range("S3").Select
Application.CutCopyMode = False
ActiveSheet.ShowAllData
ActiveSheet.Range("$A$1:$AS$1000000").AutoFilter Field:=19, Criteria1:="=UND", Operator:=xlOr, Criteria2:="=UNH"
ActiveWindow.SmallScroll Down:=-21
ActiveSheet.Range("$A$1:$AS$1000000").AutoFilter Field:=30, Criteria1:=Array( _
"DR9", "DV0", "DV5", "DV8", "DV9", "DVG", "DV*"), Operator:=xlFilterValues
ActiveWindow.SmallScroll Down:=-36
Range("S11").Select
ActiveCell.FormulaR1C1 = "SD"
Range("S11").Select
Selection.Copy
Range(Selection, Selection.End(xlDown)).Select
ActiveSheet.Paste
Range("S11").Select
Application.CutCopyMode = False
ActiveSheet.ShowAllData
ActiveWindow.SmallScroll Down:=-10
ActiveSheet.Range("$A$1:$AS$1000000").AutoFilter Field:=19, Criteria1:="UNH"
ActiveWindow.SmallScroll Down:=-27
Range("S1815").Select
ActiveCell.FormulaR1C1 = "FUHD"
Range("S1815").Select
Selection.Copy
Range(Selection, Selection.End(xlDown)).Select
ActiveSheet.Paste
Range("S1815").Select
Application.CutCopyMode = False
ActiveWindow.SmallScroll Down:=-30
ActiveSheet.ShowAllData
ActiveWindow.SmallScroll Down:=-240
Ниже приведен мой сценарий для Pandas, обратите внимание, что у меня начались проблемы с комментариями, потому что первые 12 строк кода работают отлично.
import pandas as pd
import numpy as np
data = pd.read_excel("orsthrufirstarticledeltion.xlsx", encoding = "ISO-8859-1", dtype=object)
data.loc[data.Format == 'DFHD', 'Format'] = 'SFD'
data.loc[data.Format == 'DFBG', 'Format'] = 'SFD'
data.loc[data.Format == 'DFVD', 'Format'] = 'SFD'
data.loc[data.Format == 'MFUB', 'Format'] = 'BFD'
data.loc[data.Format == 'MFBD', 'Format'] = 'BFD'
data.loc[data.Format == 'DFBD', 'Format'] = 'BFD'
data.loc[data.Format == 'UFNC', 'Format'] = 'CFD'
data.loc[data.Format == 'BFYD', 'Format'] = 'BFD'
# Trouble starts below
data.loc[(data["Fmt"] != str) & (data["Format"] == "UN*"), "Format"] = 'BD' # the UN* did not work
#data.loc[(data["Fmt"] == '350') & (data["Format"] == "UNB"), "Format"] = 'BD'
#data.loc[(data["Fmt"] != str) & (data[data.Format.str.startswith('UN',na=False)]), "Format"] = 'BD'
#
writer = pd.ExcelWriter('mstrplc2.xlsx', engine='xlsxwriter')
data.to_excel(writer, sheet_name='Sheet1')
writer.save()
----- Новая попыткаПри получении решения ---------
Ниже, пожалуйста, просмотрите пример фрейма данных с необработанными данными, с которых мы начнем, у меня есть код для экспорта в Excel, если вы хотите.
import pandas as pd
startdf = pd.DataFrame({'Column_A':['DFHD', 'DFBG', 'DFVD', 'MFUB', 'MFBD', 'DFBD', 'UFNC', 'UFNC', 'BFYD',
'UNFZ', 'UNT', 'UNIX', 'UNFZ', 'UNT', 'UNIX','UNFZ', 'UNT', 'UNIX', 'UNFZ', 'UNT', 'UNIX','UNFZ', 'UNT', 'UNIX'],
'Column_B':['test','test','test','test','test','test','test','test','test','B50','DVG','DV9','DV5','DV0','B25','U66','U1C','350','357','BVG','DBG','BUG','UVG','DV8']})
writer = pd.ExcelWriter('testdf.xlsx', engine='xlsxwriter')
startdf.to_excel(writer, sheet_name='Sheet1')
Первым шагом будет получение всех значений в столбце A и замена существующих значений новыми значениями, перечисленными ниже (поэтому мы просто редактировали столбец A)
- "DFHD" -> "SFD" "DFBG" -> "SFD" "DFVD" -> "SFD" "MFUB" -> "BFD" "MFBD" -> "BFD" "DFBD" -> "BFD""UFNC" -> "CFD" "UFNC" -> "CFD" "BFYD" -> "BFD"
После записи в этой логике данные должны выглядеть следующим образом:
df2 = pd.DataFrame({'Column_A':['SFD', 'SFD', 'SFD', 'BFD', 'BFD', 'BFD', 'CFD', 'CFD', 'BFD',
'UNFZ', 'UNT', 'UNIX', 'UNFZ', 'UNT', 'UNIX','UNFZ', 'UNT', 'UNIX', 'UNFZ', 'UNT', 'UNIX','UNFZ', 'UNT', 'UNIX'],
'Column_B':['test','test','test','test','test','test','test','test','test','B50','DVG','DV9','DV5','DV0','B25','U66','U1C','350','357','BVG','DBG','BUG','UVG','DV8']})
Теперь мы продолжим редактировать только столбец A, но используем значение в столбце B, чтобы определить, какими должны быть значения столбца A, так что думайте о каждом значении строка за строкой.Сначала отфильтруйте SFD, BFD и CFD из столбца A, чтобы оставшиеся значения были «UNFZ», «UNT», «UNIX», «UNFZ», «UNT», «UNIX», «UNFZ», «UNT»,«UNIX», «UNFZ», «UNT», «UNIX», «UNFZ», «UNT», «UNIX».Для этих оставшихся значений мы посмотрим на столбец B, чтобы решить, как изменить то, что находится в столбце A. Логика ниже:
- Значения, начинающиеся с B или числа в столбце B, должны означать, чтозначение соответствующей строки в столбце A теперь должно измениться на BFD
- Значения, начинающиеся с D или OPT в столбце B, должны означать, что значение соответствующей строки в столбце A теперь должно измениться на SFD
- Значения начинаютсяс U или числом в столбце B, должно означать, что значение соответствующей строки в столбце A теперь должно измениться на UHFD
. После этой логики конечный выходной кадр данных должен быть
resultdf = pd.DataFrame({'Column_A':['SFD', 'SFD', 'SFD', 'BFD', 'BFD', 'BFD', 'CFD', 'CFD', 'BFD',
'BFD', 'SFD', 'SFD', 'SFD', 'SFD', 'BFD','UHFD', 'UHFD', 'BFD', 'BFD', 'BFD', 'SFD','BFD', 'UHFD', 'SFD'],
'Column_B':['test','test','test','test','test','test','test','test','test','B50','DVG','DV9','DV5','DV0','B25','U66','U1C','350','357','BVG','DBG','BUG','UVG','DV8']})
writer = pd.ExcelWriter('finalresult.xlsx', engine='xlsxwriter')
resultdf.to_excel(writer, sheet_name='Sheet1')