Ряды, разделенные на скалярные результаты в NaN / 0 - PullRequest
2 голосов
/ 16 февраля 2020

У меня есть серия сгруппированных по районам -> типам преступлений -> количество преступлений:

PdDistrict  Category                   
BAYVIEW     ASSAULT                        8976
            BURGLARY                       2891
            DISORDERLY CONDUCT              207
            DRIVING UNDER THE INFLUENCE     188
            DRUG/NARCOTIC                  2061
                                           ... 
TENDERLOIN  STOLEN PROPERTY                 299
            TRESPASS                        665
            VANDALISM                      1710
            VEHICLE THEFT                   661
            WEAPON LAWS                     791
Name: IncidntNum, Length: 140, dtype: int64

Моя цель - разделить каждое значение со скаляром.

Я попытался сделать это, используя al oop, перебрав «PdDistricts» и запустив следующую строку:

series[district] = series[district] / sum(series[district])

Если я запускаю только series[district] / sum(series[district]), вывод будет таким, как предполагалось:

 Category
ASSAULT                        0.11434063
BURGLARY                       0.09323762
DISORDERLY CONDUCT             0.00427552
DRIVING UNDER THE INFLUENCE    0.00478544
DRUG/NARCOTIC                  0.05691535
DRUNKENNESS                    0.00596219
LARCENY/THEFT                  0.46712952
PROSTITUTION                   0.00027457
ROBBERY                        0.02753589
STOLEN PROPERTY                0.00917863
TRESPASS                       0.01247352
VANDALISM                      0.09335530
VEHICLE THEFT                  0.09884679
WEAPON LAWS                    0.01168902
Name: IncidntNum, dtype: float64

Но когда я пытаюсь обновить существующую часть серии, работающей series[district] = series[district] / sum(series[district]), я получаю:

 Category
ASSAULT                        0
BURGLARY                       0
DISORDERLY CONDUCT             0
DRIVING UNDER THE INFLUENCE    0
DRUG/NARCOTIC                  0
DRUNKENNESS                    0
LARCENY/THEFT                  0
PROSTITUTION                   0
ROBBERY                        0
STOLEN PROPERTY                0
TRESPASS                       0
VANDALISM                      0
VEHICLE THEFT                  0
WEAPON LAWS                    0
Name: IncidntNum, dtype: int64

Что не так, как предполагалось. Если я использую .lo c, я просто получаю NaN вместо 0.

Я просто не могу понять, что происходит, все решения, которые я попробовал, потерпели неудачу, и я думаю, что ключевая проблема заключается в том, что я не до конца понимаю, как работать с Series в Pandas.

Надеюсь, вы поможете мне понять проблему.

/ Миккель

1 Ответ

0 голосов
/ 16 февраля 2020

Я полагаю, вам нужно Series.sum на первый уровень PdDistrict - для сумм значений на первый уровень MultiIndex:

s1 = s.sum(level=0)
print (s1)
PdDistrict
BAYVIEW       14323
TENDERLOIN     4126
Name: IncidntNum, dtype: int64

А затем разделить на Series.div по первому уровню, поэтому деление по суммам PdDistrict s:

s2 = s.div(s1, level=0)
print (s2)
PdDistrict  Category                   
BAYVIEW     ASSAULT                        0.626684
            BURGLARY                       0.201843
            DISORDERLY CONDUCT             0.014452
            DRIVING UNDER THE INFLUENCE    0.013126
            DRUG/NARCOTIC                  0.143894
TENDERLOIN  STOLEN PROPERTY                0.072467
            TRESPASS                       0.161173
            VANDALISM                      0.414445
            VEHICLE THEFT                  0.160204
            WEAPON LAWS                    0.191711
Name: IncidntNum, dtype: float64
...