Итак, у меня есть программа, которая просматривает данные о продажах и должна суммировать объемы продаж по штатам и кварталам. У меня есть вложенный dict с четвертями внутри каждого ключа состояния, например statesByQ = dict.fromkeys([set of state codes], [dict of quarters])
Затем у меня есть для l oop, который циклически перебирает DataFrame, индексируется уникальными именами в каждой строке и захватывает состояние, квартал и сумма с каждого. Затем он должен добавить сумму к указанной c вложенной точке диктовки для каждого штата и квартала, как показано ниже
for opps in sdfs.index:
amount = sdfs["Amount"][opps]
state = sdfs['Billing State/Province'][opps]
fisp =sdfs['Fiscal Period'][opps]
statesByQ[state][fisp] += amount
Но когда я go до конца и смотрю на результаты, он просто продолжает суммировать все суммы независимо от места в диктанте, на которое он указывал в данный момент времени, и назначая их в качестве значения. Вот как это выглядит, если я распечатаю каждую переменную:
opps: ALI: BOB,MO_Maker45_04.17-18.2019
state: MO
fisp: Q2-2019
amount: 19837.85
value assigned to dict: 19837.85
opps: ALI: JOHN, VA_L4_05.06.2019
state: VA
fisp: Q2-2019
amount: 10059.36
value assigned to dict: 29897.21
Редактировать: Добавление данных образца
![So each row is one sale, and I want to sum all the sales for each state by fiscal period.](https://i.stack.imgur.com/HddEE.png)
Так что Повторяю, проблема в том, что он, кажется, не передает должным образом новые ключи для словаря, даже если значение их переменной изменилось, т.е. хотя переменные state
и fisp
обновлены с новыми ключами из Dataframe, кажется, что они не попадают в словарь должным образом. Если я go в отладке и наблюдаю за заполнением словаря, он возьмет первое amount
значение и поместит его на свое место, затем он возьмет следующее значение суммы и добавит его к предыдущему, даже если они не являются то же самое, затем устанавливает для обоих местоположений dict одинаковое значение. Так что в моем примере выше, statesByQ['MO']['Q2-2019']
и statesByQ['VA']['Q2-2019']
установлены на 29897,21 вместо их соответствующих 19837,85 и 10059,36