Как фильтровать данные по одному столбцу и группировать по другому столбцу - PullRequest
0 голосов
/ 28 декабря 2018

У меня проблема со сжатыми значениями в одном словаре на основе значения другого.

Я составил такой код ниже, который представляет идею:

1) Извлечение данных в список

2) Принятие уникальных значений для следующей обработки

3) Цикл для подсчета количества мужчин и женщин только для «несчастного случая»

Проблема:

Каково эффективное решение для подсчета значений для каждой категории в уникальном наборе.Я имею в виду, что если бы у меня было 1000 уникальных категорий, я не хочу писать 1000 «если»

Это мой первый вопрос в stackoverflow, поэтому я прошу прощения за любую ошибку, которую я сделал :)

Original data (first 5 rows):
[
['', 'year', 'month', 'intent', 'police', 'sex', 'age', 'race', 'hispanic', 'place', 'education'], 
['1', '2012', '01', 'Suicide', '0', 'M', '34', 'Asian/Pacific Islander', '100', 'Home', '4'], 
['2', '2012', '01', 'Suicide', '0', 'F', '21', 'White', '100', 'Street', '3'], 
['3', '2012', '01', 'Suicide', '0', 'M', '60', 'White', '100', 'Other specified', '4'], 
['4', '2012', '02', 'Suicide', '0', 'M', '64', 'White', '100', 'Home', '4']
]



# Accidents list
accidents_list = [row[3] for row in data] # list of all accidents

print(set(accidents_list)) # unique set 

{'Убийство', 'NA', 'Undefined', 'Случайное', 'Suicide'}

gender_list = [row[5] for row in data]
print(gender_list)

['M', 'F', 'M',«М», «М», «М», «М», «М», «М», «М», «М», «М», «М», «М», «М», «М»',' M ',' M ',' M ',' M ',' M ',' F ',' F ',' M ',' M '....]

# Accidents dict and loop over it
accidents_gender = {}

for i, v in enumerate(gender_list):
    if v not in accidents_gender:
        accidents_gender[v] = 0
    if accidents_list[i] == 'Accidental':
        accidents_gender[v] += 1

print(accidents_gender) # printing only values for accidental 

{'M': 1421, 'F': 218}

1 Ответ

0 голосов
/ 28 декабря 2018

Вы можете использовать Counter (задокументировано здесь ).

Я бы использовал Pandas (пример ниже), но если это излишество, вот способ решить это сCounter:

from collections import Counter

# Exclude header
data = data[1:]

# Filter accidents
accidents = filter(lambda x: x[3] == 'Accidental', data)

# Count by gender
by_gender = Counter(item[5] for item in accidents)
print(by_gender)

Вот способ сделать это с Пандами:

import pandas as pd

df = pd.DataFrame.from_records(data=data[1:], columns=data[0])

# Filter 'Accidental', group by sex, get the size of each group
df = df[df['intent'] == 'Accidental'].groupby('sex').size()

# Print it out
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
    print(df)

Для этого вам лучше использовать Блокнот Jupyter.Документация Pandas превосходна, но ее также нужно много переварить. Этот SO-ответ содержит хорошую и актуальную информацию.

Надеюсь, это поможет.

...