簡體   English   中英

機器學習 Python 中具有多個值的特征匯總 model

[英]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 個新功能,一個用於每個懷孕三個月,用於保存該三個月記錄的最大測量值:

  1. abdomCirc1st:此功能將保留在 0 到 13 周之間測量的所有腹圍測量值的最大值
  2. abdomCirc2nd:此功能將保留在 14 至 26 周之間測量的所有腹圍測量值的最大值
  3. abdomCirc3rd:此功能將保存 27 至 40 周之間測量的所有腹圍測量值的最大值

所以我的最終數據集看起來像這樣:

PregnancyID     MotherID    abdomCirc1st  abdomCirc2nd   abdomCirc3rd
0               0           NaN           200            NaN
1               1           NaN           315            350
2               2           180           NaN            NaN

此處使用最大值的原因是較大的腹圍與我試圖預測的不良結果相關。

但是我很困惑如何 go 關於這個。 我以前使用groupby function 從多次測量中得出某些統計特征,但這是一項更復雜的任務。

我想要做的是:

  1. 根據 gestationalAgeInWeeks 值將屬於同一妊娠的所有腹圍測量值分組為 3 個妊娠期

  2. 計算每個三個月內所有腹圍測量值的最大值,並將此值分配給相關特征; 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.

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