我有一個資料集,其中各組在不同時間接受治療,我需要記錄各組首次接受治療的年份,否則為所有未治療組提供 0 值。
df = pd.DataFrame([['CA',2014,0],['CA',2015,0],['CA',2016,1],['CA',2017,1],
['WA',2011,0],['WA',2012,1],['WA',2013,1],['TX',2010,0]],
columns=['Group_ID','Year','Treated'])
完成后資料框應如下所示:
| Group_ID | 年 | 處理過的 | First_Trated |
|---|---|---|---|
| 加州 | 2014 | 0 | 0 |
| 加州 | 2015 | 0 | 0 |
| 加州 | 2016 年 | 1 | 2016 年 |
| 加州 | 2017 | 1 | 2016 年 |
| 西澳 | 2011 | 0 | 0 |
| 西澳 | 2012 | 1 | 2012 |
| 西澳 | 2013 | 1 | 2012 |
| 德克薩斯州 | 2010 | 0 | 0 |
下面的 Python 代碼回傳每個后續year值,而不是第一個year處理值。
df['first_treated'] = np.where(df['Treated']==1, df['Year'], 0)
我已經嘗試過agg()和min()功能,但都不能正常作業。
df['first_treated'] = np.where(df['Treated']==1,df['Year'].min,0)
我還在Create a group variable first.treat 中使用了 R 代碼,表示每個單元被處理的第一年,但是使用空first_treated列,沒有資料插入到帶有mutate()函式的列中。在類似的 pandas 資料幀上使用該 R 腳本時,我沒有收到任何錯誤。
uj5u.com熱心網友回復:
我們可以使用 來創建組鍵cumsum,然后transform將first值分配回去
s = df['Treated'].eq(0)
df['new'] = df[~s].groupby(df['Treated'].eq(0).cumsum())['Year'].transform('first')
df.new.fillna(0,inplace=True)
#df.new = df.new.astype(int)
df
Group_ID Year Treated new
0 CA 2014 0 0.0
1 CA 2015 0 0.0
2 CA 2016 1 2016.0
3 CA 2017 1 2016.0
4 WA 2011 0 0.0
5 WA 2012 1 2012.0
6 WA 2013 1 2012.0
7 TX 2010 0 0.0
uj5u.com熱心網友回復:
對于 R 版本,我們可以使用 tidyverse 包group_by(group_id),然后用于mutate()創建first_treated列,類似于您嘗試解決問題的方式。我們可以使用 lubridate 包來輕松處理日期。
df = data.frame(
group_id = c(rep("CA", 4), rep("WA", 3), "TX"),
year = c("2014", "2015", "2016", "2017", "2011", "2012", "2013", "2010"),
treated = c(0,0,1,1,0,1,1,0))
df %>%
group_by(group_id) %>%
mutate(year = lubridate::as_date(year, format = '%Y'),
first_treated = ifelse(treated == 1, min(lubridate::year(year)), 0))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/412439.html
標籤:
上一篇:將一個資料框劃分為多個R中的名稱
