[英]Summarising features with multiple values in Python for Machine Learning model
我有一個包含不同胎兒超聲測量值的數據文件。 測量值是在懷孕期間的不同時間點收集的,如下所示:
PregnancyID MotherID gestationalAgeInWeeks abdomCirc
0 0 14 150
0 0 21 200
1 1 20 294
1 1 25 315
1 1 30 350
2 2 8 170
2 2 9 180
2 2 18 NaN
從上表中可以看出,我每次懷孕都會進行多次測量(每次測量 1 到 26 次)。
我想以某種方式總結超聲測量,以便我可以用每次懷孕的固定數量的特征代替多次測量。 所以我想創建 3 個新功能,一個用於每個懷孕三個月,用於保存該三個月記錄的最大測量值:
所以我的最終數據集看起來像這樣:
PregnancyID MotherID abdomCirc1st abdomCirc2nd abdomCirc3rd
0 0 NaN 200 NaN
1 1 NaN 315 350
2 2 180 NaN NaN
此處使用最大值的原因是較大的腹圍與我試圖預測的不良結果相關。
但是我很困惑如何 go 關於這個。 我以前使用groupby function 從多次測量中得出某些統計特征,但這是一項更復雜的任務。
我想要做的是:
根據 gestationalAgeInWeeks 值將屬於同一妊娠的所有腹圍測量值分組為 3 個妊娠期
計算每個三個月內所有腹圍測量值的最大值,並將此值分配給相關特征; abdomCirc1st、abdomCir2nd 或 abdomCirc3rd。
我想我必須按照以下方式做一些事情:
df["abdomCirc1st"] = df.groupby(['MotherID', 'PregnancyID', 'gestationalAgeInWeeks'])["abdomCirc"].transform('max')
但是此代碼不檢查測量是在哪個三個月進行的 (gestationalAgeInWeeks)。 我將不勝感激對這項任務的一些幫助。
有一個神奇的命令叫做查詢。 現在應該完成您的工作:
abdomCirc1st = df.query('MotherID == 0 and PregnancyID == 0 and gestationalAgeInWeeks <= 13')['abdomCirc'].max()
abdomCirc2nd = df.query('MotherID == 0 and PregnancyID == 0 and gestationalAgeInWeeks >= 14 and gestationalAgeInWeeks <= 26')['abdomCirc'].max()
abdomCirc3rd = df.query('MotherID == 0 and PregnancyID == 0 and gestationalAgeInWeeks >= 27 and gestationalAgeInWeeks <= 40')['abdomCirc'].max()
如果你想要更自動化的東西(而不是手動更改你的 ID 的值:MotherID 和 PregnancyID,每次針對每一組不同的行),你必須將它與 groupby 結合(就像你自己做的那樣)
也檢查一下: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.query.html
你可以試試這個。 有點復雜的查詢,但它似乎有效:
(df.groupby(['MotherID', 'PregnancyID'])
.apply(lambda d: d.assign(tm = (d['gestationalAgeInWeeks']+ 13 - 1 )// 13))
.groupby('tm')['abdomCirc']
.apply(max))
.unstack()
)
產生
tm 1 2 3
MotherID PregnancyID
0 0 NaN 200.0 NaN
1 1 NaN 294.0 350.0
2 2 180.0 NaN NaN
讓我們稍微取消一下。 首先,我們對groupby
、PregnancyID 進行分組。 然后我們apply
function 應用於每個分組 dataframe ( d
)
對於每個 d,我們通過assign
創建一個“三個月”列'tm'
(我假設我在這里得到了數學,但如果它是錯誤的,請更正它),然后我們按'tm'
groupby
並應用max
。 對於每個子數據幀d
然后我們獲得一個系列tm:max(abdomCirc)
。
然后我們unstack()
將tm
移動到列名
您可能想稍后重命名此列,但我沒有打擾
想一想,您可以稍微簡化一下上面的內容:
(df.assign(tm = (df['gestationalAgeInWeeks']+ 13 - 1 )// 13))
.drop(columns = 'gestationalAgeInWeeks')
.groupby(['MotherID', 'PregnancyID','tm'])
.agg('max')
.unstack()
)
類似的想法,相同的 output。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.