全部 =
| 日期 | C1型 | 日期 | C2型 | ..... | C10日期 | C型10 | PolDate |
|---|---|---|---|---|---|---|---|
| dd-mm-yyyy | :提案人 | 鈉鹽 | NaN | 鈉鹽 | NaN | dd-mm-yyyy | |
| dd-mm-yyyy | :提案人 | 鈉鹽 | NaN | 鈉鹽 | NaN | dd-mm-yyyy | |
| dd-mm-yyyy | :其他 | dd-mm-yyyy | 提議者 | 鈉鹽 | NaN | dd-mm-yyyy | |
| dd-mm-yyyy | :提案人 | 鈉鹽 | NaN | 鈉鹽 | NaN | dd-mm-yyyy | |
| dd-mm-yyyy | :其他 | dd-mm-yyyy | 其他 | 鈉鹽 | NaN | dd-mm-yyyy |
whereC指的是Claim
等等。即有多達 10Claims行。
我需要確定是否有任何Claims來自Proposer并且對于這些索賠是否在 3 年內發生PolDate(PolDate總是大于任何Cdate)
我能夠執行以下操作,但無法在回圈中使用日期減法:
CLM = {}
for i in range(1 , 11):
CLM[i] = toto.loc[toto[f'C{i}Type'] == 'Proposer']
#can't get this date subtraction to work within the loop. But can do the subtraction outside of the loop.
CLM[i]['diff'] = (CLM[i]['PolDate'].sub(CLM[i][f'C{i}Date'],
axis=0)).dt.days
use_cols = ['CustomerID', f'C{i}Type', f'C{1}Date', 'PolDate ']
CLM[i] = CLM[i][use_cols]
print("Claim:" f'{i}' " " str(CLM[i].shape))
錯誤:
試圖在來自 DataFrame 的切片副本上設定值。嘗試使用 .loc[row_indexer,col_indexer] = value 代替
此外,無法進行 3 年比較:
if (CLM[1]['diff'] > 1095):
#1095 = (365 * 3):
CLM[1]['CLMLAST3'] = 0
else:
CLM[1]['diff'] = 1
錯誤:
ValueError:系列的真值不明確。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
uj5u.com熱心網友回復:
簡而言之,試試這個,它對我有用:(不知道多少熊貓所以也許效率是你的領域,我只是從發布的代碼中洗掉了錯誤)
CLM = {}
for i in range(1 , 11):
CLM[i] = toto.loc[toto[f'C{i}Type'] == 'Proposer']
#can't get this date subtraction to work within the loop. But can do the subtraction outside of the loop.
**CLM.get(i).loc[:, 'diff'] = (pd.to_datetime(CLM[i]['PolDate'],format='%d-%m-%Y').sub(pd.to_datetime(CLM[i][f'C{i}Date'],format='%d-%m-%Y'))).dt.days**
use_cols = ['CustomerID', f'C{i}Type', f'C{1}Date', 'PolDate ']
CLM[i] = CLM[i][use_cols]
print("Claim:" f'{i}' " " str(CLM[i].shape))
注意事項:
警告“正在嘗試在 DataFrame 的切片副本上設定值。嘗試使用 .loc[row_indexer,col_indexer] = value 代替”也在此代碼中。因為 CLM[i]['diff'] 與 CLM[i].loc['diff'] 不同。見這里:https://stackoverflow.com/a/53954986/5772008
CLM[i]['PolDate'] 是字串的“串列”,因此您不能從字串中減去一個字串,但可以從另一個字串中減去一個 Pandas 日期時間物件。因此,首先將它們轉換為 datetime 物件,然后減去。
與您將串列與值進行比較的額外問題相同,請參閱此https://stackoverflow.com/a/53830333/5772008 簡而言之,您很可能想要這樣的:“if (CLM[1]['diff' ].all() > 1095)",所以它比較系列中的每個值,而不是整個系列與一個值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/343286.html
