предложение по фильтрации списков элементов, что соответствует другим спискам - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть четыре списка, длина которых составляет около 200 000.Первый список содержит значения часов от 1 до 24, вот пример

Hour_list = [1,2,2,2,5,5,7,5,12,18,24,.....] 
avg_occupancy = [0,5,9,5,13,24,56,23,.....]
avg_absences = [0,4,5,7,8,6,8,3,2,1.....]
Room_config= ['config_a001', 'configa002', 'configa003', 'configa004', 'configa005'.........]

Мне нужно создать 24 списка для каждого часа, list_hour1, List_Hour2 и т. Д., А затем отфильтровать остальные три списка на основе ихНапример, List_Hour2 должен содержать число 2, а avg_ocupancy_hour_2 должен содержать все элементы с индексами, которые соответствуют индексам числа 2 из первого списка, это означает, что avg_ocupancy_hour_2 = [5,9,5, ......], avg_absences_2 = [4,5,7, ....], Room_config = ['configa002', 'configa003', 'configa004', 'configa005' .........]

Я думаю, что Zip был бы хорош, но не уверен, как использовать его в этой ситуации

Ответы [ 3 ]

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

Да, это как ... именно поэтому фреймы данных - вещь.

Hour_list = [1,2,2,2]
avg_occupancy = [0,5,9,5]
avg_absences = [0,4,5,7]
Room_config= ['config_a001', 'configa002', 'configa003', 'configa004']

Поместите их в панды:

import pandas as pd
data = pd.DataFrame(dict(Hour_list = Hour_list, avg_occupancy = avg_occupancy, avg_absences = avg_absences, Room_config = Room_config))

Сгруппируйте их:

hour_groups = data.groupby('Hour_list')

И теперь вы можете делать все, что угодно - вы можете рассчитывать сводную статистику или просто выполнять итерации по всем часам:

for hour, hour_data in hour_groups:
    do_stuff(hour_data)

Для вашего дополнительного вопроса вы можете взять средства и рассчитать их следующим образом:

mean_data = hour_groups[['avg_occupancy', 'avg_absences']].agg('mean')
mean_data['count'] = hour_groups['avg_occupancy'].count()

Тогда вы можете просто выбрать, какая строка имеет индекс 9 (т. Е. Час 9) с .loc и логическим тестом.

mean_data.loc[mean_data.index == 9, :]

Часть , : указывает пандам возвращать все столбцы любых строк, которые соответствуют тесту mean_data.index == 9.

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

я предоставил вам следующий код;он основан на случайных данных и использует библиотеку панд, а также даст вам больше гибкости:

import pandas as pd
import numpy as np

hours = np.arange(1, 25)
data = {'hours': [hours[np.random.randint(low=0, high=24)] for i in np.arange(1000)],
        'occupancy': np.random.randint(low=0, high=100, size=1000),
        'absences' : np.random.randint(low=0, high=10, size= 1000)
       }
df = pd.DataFrame(data=data)

# Extract data for hour == 7
df[df['hours'] == 7]
0 голосов
/ 10 декабря 2018

Использование zip и defaultdict (и класса для чистоты):

из коллекции import defaultdict

hour_list     = [1,2,2,2,5,5,7,5] 
avg_occupancy = [0,5,9,5,13,24,56,23]
avg_absences  = [0,4,5,7,8,6,8,3]
room_config   = ['configa001', 'configa002', 'configa003', 'configa004', 
                 'configa005', 'configa006', 'configa007', 'configa008']


class Tracker:
    def __init__(self):
        self.avg_occupancy = defaultdict(list)
        self.avg_absences  = defaultdict(list) 
        self.room_config   = defaultdict(list)

    def add(self, h, ao, aa, rc):
        self.avg_occupancy[h].append(ao)
        self.avg_absences[h].append(aa)
        self.room_config[h].append(rc)

    # Optional, of course
    def __repr__(self):
        import json
        return json.dumps(vars(self), indent=4)


t = Tracker()
for row in zip(hour_list, avg_occupancy, avg_absences, room_config):
    t.add(*row)


print(t)

Производит:

{   
    "avg_occupancy": {
        "1": [0],
        "2": [5, 9, 5],
        "5": [13, 24, 23],
        "7": [56]
    },
    "avg_absences": {
        "1": [0],
        "2": [4, 5, 7],
        "5": [8, 6, 3],
        "7": [8]
    },
    "room_config": {
        "1": ["configa001"],
        "2": ["configa002", "configa003", "configa004"],
        "5": ["configa005", "configa006", "configa008"],
        "7": ["configa007"]
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...