关于筛选与其他列表相对应的列表项的建议

2024-04-25 18:52:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有四份名单,长度约20万。第一个列表包含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\u hour1、list\u Hour2等等,然后根据它们过滤其他三个列表,例如,list\u Hour2应该包含数字2,avg\u ocupancy\u hour\u 2应该包含索引与第一个列表中数字2的索引相对应的所有项目,这意味着avg\u ocupancy\u hour\u 2=[5,9,5,…],平均缺勤率2=[4,5,7,…],房间配置=['configa002','configa003','configa004','configa005'…]

我认为Zip会很好,但不知道如何利用它在这种情况下


Tags: config示例列表数字listavg小时名单
3条回答

是的,这就像。。这就是为什么数据帧是一种东西。你知道吗

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()

然后,您可以通过.loc和逻辑测试选择索引为9(即9小时)的行。你知道吗

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

, :部分告诉pandas返回满足mean_data.index == 9测试的任何行的所有列。你知道吗

使用zipdefaultdict(以及清洁度类):

从集合导入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"]
    }
}

我向您介绍了以下代码;它基于随机数据并使用熊猫库,也将给您带来更大的灵活性:

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]

相关问题 更多 >