2016-03-09 84 views
2

我有以下格式的數據集:疊代唯一值的大熊貓

Patient Date  colA colB 
1  1/3/2015 .  5 
1  2/5/2015 3  10 
1  3/5/2016 8  . 
2  4/5/2014 2  . 
2  etc 

我想在大熊貓它把獨特的患者如在這些獨特的患者項目的項目和迭代,以保持定義函數僅適用於每列最近的觀察結果(用缺失或空值替換所有其他值)。例如:患者1,輸出將需要 -

Patient Date  colA colB 
1  1/3/2015 .  . 
1  2/5/2015 .  10 
1  3/5/2016 8  . 

我知道我可以使用的東西像。適用()以下的,但這並不佔重複患者ID ...

def getrecentobs(): 
    for i in df['Patient']: 
     etc 

任何幫助或方向是非常感謝。

回答

0

中有大熊貓一個函數調用最後這可以與groupby一起使用,以給出給定groupby的最後值。我不確定爲什麼你需要空白行,但如果你需要它們,你可以加入到原始數據框中。抱歉,排序在那裏,因爲日期未在我的樣本數據中排序。希望有所幫助。

實施例:

數據幀

 id  date  amount code 
    0 3107 2010-10-20 136.4004 290 
    1 3001 2010-10-08 104.1800 290 
    2 3109 2010-10-08 276.0629 165 
    3 3001 2010-10-08 -177.9800 290 
    4 3002 2010-10-08 1871.1094 290 
    5 3109 2010-10-08 225.7038 155 
    6 3109 2010-10-08 98.5578 170 
    7 3107 2010-10-08 231.3949 165 
    8 3203 2010-10-08 333.6636 290 
    9 -9100 2010-10-08 3478.7500 290 

如果不需要以前的行:

b.sort_values("date").groupby(["id","date"]).last().reset_index() 

的GROUPBY由 「最後」 意爲那些列的最後一個值彙總的數據。

輸出只值最新行:

id  date  amount code 
0 -9100 2010-10-08 3478.7500 290 
1 3001 2010-10-08 -177.9800 290 
2 3002 2010-10-08 1871.1094 290 
3 3107 2010-10-08 231.3949 165 
4 3107 2010-10-20 136.4004 290 
5 3109 2010-10-08 98.5578 170 
6 3203 2010-10-08 333.6636 290 
0

我認爲你可以使用to_numeric的值轉換.NaN,然後創建maskgroupbyrank和持續申請mask

print df 
    Patient  Date colA colB 
0  1 1/3/2015 . 5 
1  1 2/5/2015 3 10 
2  1 3/5/2016 8 . 
3  2 4/5/2014 2 . 
4  2 5/5/2014 4 . 

df['colA'] = pd.to_numeric(df['colA'], errors='coerce') 
df['colB'] = pd.to_numeric(df['colB'], errors='coerce') 
print df 
    Patient  Date colA colB 
0  1 1/3/2015 NaN  5 
1  1 2/5/2015  3 10 
2  1 3/5/2016  8 NaN 
3  2 4/5/2014  2 NaN 
4  2 5/5/2014  4 NaN 
print df.groupby('Patient')[['colA','colB']].rank(method='max', ascending=False) 
    colA colB 
0 NaN  2 
1  2  1 
2  1 NaN 
3  2 NaN 
4  1 NaN 

mask = df.groupby('Patient')[['colA','colB']].rank(method='max', ascending=False) == 1 
print mask 
    colA colB 
0 False False 
1 False True 
2 True False 
3 False False 
4 True False 

df[['colA','colB']] = df[['colA','colB']][mask] 
print df 
    Patient  Date colA colB 
0  1 1/3/2015 NaN NaN 
1  1 2/5/2015 NaN 10 
2  1 3/5/2016  8 NaN 
3  2 4/5/2014 NaN NaN 
4  2 5/5/2014  4 NaN 
0

我認爲你正在尋找pandasgroupby

例如,df.groubpy('Patient').last()將返回一個DataFrame,其中每個患者的最後一次觀察結果爲。如果患者未按date排序,則可以使用max函數查找最新記錄日期。

df.groupby('Patient').last() 
      Date colA colB 
Patient      
1  3/5/2016 8 . 
2    etc 2 . 

你可以讓自己的函數,然後調用groupbyapply()功能。