在 Python 中循环遍历 table 中的多个列

Looping through multiple columns in a table in Python

我正在尝试遍历包含 covid-19 数据的 table。我的 table 有 4 列:月份、日期、位置和案例。 table 中每一列的值都存储在自己的列表中,因此每个列表的长度都相同。 (即有月份列表、日期列表、位置列表和案例列表)。有 12 个月,一个月最多 31 天。世界上许多地方都有病例记录。我想弄清楚一年中哪一天的全球病例总数最多。我不确定如何适当地构建我的循环。由列表表示的 table 的过度简化示例版本如下所示。

在这个小例子中,结果将是第 1 个月第 3 天,有 709 个案例 (257 + 452)。

Month Day Location Cases
1 1 CAN 124
1 1 USA 563
1 2 CAN 242
1 2 USA 156
1 3 CAN 257
1 3 USA 452
. . ... ...
12 31 ... ...

您可以先查看案例列表中的最大值。然后将最大案例的索引与其他三个列表进行映射并获取它们的值。 例如:caseList = [1,2,3,52,1,0]

最大值是52。它的索引是3。在你的例子中你可以得到monthList[3], dayList[3], locationList[3] 分别。然后你会得到全球病例总数最多的相关日期、月份和国家。

检查这是否对您的情况有帮助。

我假设您已将所有数据放在同一个数据框中,df。

df = pandas.DataFrame()
df['Month'] = name_of_your_month_list
df['Day'] = name_of_your_daylist
df['Location'] = name_of_your_location_list
df['Cases'] = name_of_your_cases_list

df.Cases.max() 给你最多的案例。我假设数据集中只有一年。所以 df[df.Cases==df.Cases.max()].index 给出了你搜索的青春指数

对于当天,只需过滤:

df[df.index==df[df.Cases==df.Cases.max()].index].Day

当月:

df[df.index==df[df.Cases==df.Cases.max()].index].Month

申请案例数:

df[df.index==df[df.Cases==df.Cases.max()].index].Cases

对于国家:

df[df.index==df[df.Cases==df.Cases.max()].index].Location

看了评论,不清楚是搜索某地点最大的case还是当天最大的case。如果它是从那天开始的,您必须先使用 groupby('Day') 函数进行过滤,以将其用作 groupby('Day').max()

您可以使用此策略来获得所需的结果。

daylist,monthlist,location,Cases = [1, 2, 3, 4], [1,1,1,1],['CAN','USA','CAN','USA'],[124,563,242,999]    
maxCases = Cases.index(max(Cases))
print("Max Case:",Cases[maxCases])
print("Location:",location[maxCases])
print("Month:",monthlist[maxCases])
print("Day:",daylist[maxCases])

您按月和日对数据框进行分组。然后遍历组,找到所有位置的案例总和最大的组,如下所示:

import pandas as pd
df = pd.DataFrame({'Month':[1,1,1,1,1,1], 'Day':[1,1,2,2,3,3],
                   'Location':['CAN', 'USA', 'CAN', 'USA','CAN', 'USA'],
                   'Cases':[124,563,242,156,257,452]})

grouped = df.groupby(['Month', 'Day'])
max_sum = 0
max_day = None
for idx, group in grouped:
    if group['Cases'].sum() > max_sum:
        max_sum = group['Cases'].sum()
        max_day = group

month = max_day['Month'].iloc[1]
day = max_day['Day'].iloc[1]
print(f'Maximum cases of {max_sum} occurred on {month}/{day}.')

#prints: Maximum cases of 709 occurred on 1/3

如果您不想使用 Pandas,您可以这样做:

months = [1,1,1,1,1,1]
days = [1,1,2,2,3,3]
locations = ['CAN', 'USA', 'CAN', 'USA','CAN', 'USA']
cases = [124,563,242,156,257,452]
dic = {}
target_day = 0
count = 0

for i in range(len(days)):
    if days[i] != target_day:
        target_day = days[i]
        count = cases[i]
    else:
        count += cases[i]
        dic[f'{months[i]}/{days[i]}'] = count

max_cases = max(dic.values())
worst_day = list(dic.keys())[list(dic.values()).index(max_cases)]

print(f'Maximum cases of {max_cases} occurred on {worst_day}.')

#Prints: Maximum cases of 709 occurred on 1/3.