簡體   English   中英

Python/關於多列過濾器提高代碼效率

[英]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

補充兩點:

  1. 在這個減法中也包括了year ,所以我需要把2019加回去。

  2. 我創建了一個df_carbon的小例子來測試我的代碼。 如果您以文本形式提供了更真實的版本,我會使用您的數據測試我的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM