我想執行一個計算,即每個字母的結束日期都需要減去,Start_Date,然后除以 365 以獲得持續時間(以年為單位)。然后每個字母列的持續時間需要分別用作其字母列值的“冪”。然后需要將每個字母的結果相加得到總數。
我嘗試在使用決議的地方使用下面的編碼,并且設法得到了答案。
import pandas as pd
dataset = [['01-01-2015', 234, '25-05-2017', 633, '03-06-2016', 935, '30-10-2019', 673, '16-12-2020', 825, '06-07-2019'],
['01-01-2015', 664, '25-05-2017', 663, '03-06-2016', 665, '30-10-2019', 663, '16-12-2020', 665, '06-07-2019']]
ds = pd.DataFrame(dataset, columns = ['Start_Date', 'A', 'End_Date_A', 'B', 'End_Date_B', 'C', 'End_Date_C',
'D', 'End_Date_D', 'E', 'End_Date_E'])
Start_Date A End_Date_A B End_Date_B C End_Date_C D End_Date_D E End_Date_E
0 01-01-2015 234 25-05-2017 633 03-06-2016 935 30-10-2019 673 16-12-2020 825 06-07-2019
1 01-01-2015 664 25-05-2017 663 03-06-2016 665 30-10-2019 663 16-12-2020 665 06-07-2019
from dateutil import parser
import math
letters = ["A", "B", "C", "D", "E"]
total = 0
for i in ds.index:
for letter in letters:
start_date = parser.parse(ds["Start_Date"][i])
end_date = parser.parse(ds["End_Date_" letter][i])
years = (end_date - start_date).days / 365
power = math.pow(int(ds[letter][i]), years)
total = power
ds['Overall'] = total
但是,它為每一行顯示相同的結果。
Start_Date A End_Date_A B End_Date_B C End_Date_C D End_Date_D E End_Date_E Overall
0 01-01-2015 234 25-05-2017 633 03-06-2016 935 30-10-2019 673 16-12-2020 825 06-07-2019 1.388585e 17
1 01-01-2015 664 25-05-2017 663 03-06-2016 665 30-10-2019 663 16-12-2020 665 06-07-2019 1.388585e 17
是否有任何其他提示可以執行此操作并根據每行值獲取總數?
uj5u.com熱心網友回復:
這里不需要使用 for 回圈,我們可以使用基于矢量化 pandas 的方法:
letters = pd.Index(['A', 'B', 'C', 'D', 'E'])
start = pd.to_datetime(ds['Start_Date'], dayfirst=True)
dates = ds['End_Date_' letters].apply(pd.to_datetime, dayfirst=True)
years = dates.sub(start, axis=0).astype('timedelta64[D]').div(365)
ds['Overall'] = ds[letters].pow(years.values).sum(1)
結果
print(ds)
Start_Date A End_Date_A B End_Date_B C End_Date_C D End_Date_D E End_Date_E Overall
0 01-01-2015 234 25-05-2017 633 03-06-2016 935 30-10-2019 673 16-12-2020 825 06-07-2019 7.261803e 16
1 01-01-2015 664 25-05-2017 663 03-06-2016 665 30-10-2019 663 16-12-2020 665 06-07-2019 6.624869e 16
或者,如果您仍想使用現有代碼,這里有一個簡單的修復:
for i in ds.index:
total = 0 # Moved inside outer for-loop
for letter in letters:
start_date = parser.parse(ds["Start_Date"][i])
end_date = parser.parse(ds["End_Date_" letter][i])
years = (end_date - start_date).days / 365
power = math.pow(int(ds[letter][i]), years)
total = power
ds.loc[i, 'Overall'] = total # Notice the change here
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/446039.html
上一篇:正確顯示來自JSON的HTML
