[英]Python - How to decrease big O and increase efficiency in multiple nested for loops?
[英]Python/increase code efficiency about multiple columns filter
我想知道是否有人可以幫助我找到一種更有效的方式來運行我的代碼。
我有一個包含 7 列的數據集,分別是國家、部門、年、月、周、工作日、值。
年份列只有 3 個元素,2019,2020,2021
我在這里要做的是從 2019 年減去 2020 年和 2021 年的每個值。但是更復雜的是我需要匹配工作日列。
例如,我需要用2020年1月1周0工作日(星期一)的值來減去,2019年1月1周1工作日0(星期一)的值,如果找不到就pass,依此類推,這意味着工作日(星期一,星期二....必須匹配)
這是我的代碼,它可以運行,但它花了我幾個小時:(
for i in itertools.product(year_list,country_list, sector_list,month_list,week_list,weekday_list):
try:
data_2 = df_carbon[(df_carbon['country'] == i[1])
& (df_carbon['sector'] == i[2])
& (df_carbon['year'] == i[0])
& (df_carbon['month'] == i[3])
& (df_carbon['week'] == i[4])
& (df_carbon['weekday'] == i[5])]['co2'].tolist()[0]
data_1 = df_carbon[(df_carbon['country'] == i[1])
& (df_carbon['sector'] == i[2])
& (df_carbon['year'] == 2019)
& (df_carbon['month'] == i[3])
& (df_carbon['week'] == i[4])
& (df_carbon['weekday'] == i[5])]['co2'].tolist()[0]
co2.append(data_2-data_1)
country.append(i[1])
sector.append(i[2])
year.append(i[0])
month.append(i[3])
week.append(i[4])
weekday.append(i[5])
except:
pass
我將 for 循環更改為 itertools,但它仍然不夠快,還有其他想法嗎? 非常感謝:)
############################## 這里是示例數據集
country co2 sector date week weekday year month
Brazil 108.767782 Power 2019-01-01 0 1 2019 1
China 14251.044482 Power 2019-01-01 0 1 2019 1
EU27 & UK 1886.493814 Power 2019-01-01 0 1 2019 1
France 53.856398 Power 2019-01-01 0 1 2019 1
Germany 378.323440 Power 2019-01-01 0 1 2019 1
Japan 21.898788 IA 2021-11-30 48 1 2021 11
Russia 19.773822 IA 2021-11-30 48 1 2021 11
Spain 42.293944 IA 2021-11-30 48 1 2021 11
UK 56.425121 IA 2021-11-30 48 1 2021 11
US 166.425000 IA 2021-11-30 48 1 2021 11
或這個
import pandas as pd
pd.DataFrame({
'year': [2019, 2020, 2021],
'co2': [1,2,3],
'country': ['Brazil', 'Brazil', 'Brazil'],
'sector': ['power', 'power', 'power'],
'month': [1, 1, 1],
'week': [0,0,0],
'weekday': [0,0,0]
})
pandas
可以逐個索引減去兩個 dataframe,所以我們的想法是將您的數據分成一個被減數和一個減數,將['country', 'sector', 'month', 'week', 'weekday']
設置為他們的索引,只需減去它們,並刪除未找到 2019 年匹配項的行(通過dropna
)。
df_carbon = pd.DataFrame({
'year': [2019, 2020, 2021],
'co2': [1,2,3],
'country': ['ab', 'ab', 'bc']
})
index = ['country']
# index = ['country', 'sector', 'month', 'week', 'weekday']
df_2019 = df_carbon[df_carbon['year']==2019].set_index(index)
df_rest = df_carbon[df_carbon['year']!=2019].set_index(index)
ans = (df_rest - df_2019).reset_index().dropna()
ans['year'] += 2019
補充兩點:
在這個減法中也包括了year
,所以我需要把2019
加回去。
我創建了一個df_carbon
的小例子來測試我的代碼。 如果您以文本形式提供了更真實的版本,我會使用您的數據測試我的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.