[英]iterate over unique values in PANDAS
我有以下格式的數據集:
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
我試圖在 PANDAS 中定義一個函數,它將獨特的患者視為一個項目並迭代這些獨特的患者項目以僅保留每列的最新觀察結果(用缺失或空值替換所有其他值)。 例如:對於患者 1,輸出將需要 -
Patient Date colA colB
1 1/3/2015 . .
1 2/5/2015 . 10
1 3/5/2016 8 .
我知道我可以在 .apply() 中使用類似下面的內容,但這不考慮重復的患者 ID...
def getrecentobs():
for i in df['Patient']:
etc
非常感謝任何幫助或指導。
我認為您可以使用to_numeric
來轉換值.
到NaN
,然后使用groupby
和rank
創建mask
並最后應用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
Pandas 中有一個名為 last 的函數,它可以與 groupby 一起使用,為您提供給定 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 按“last”聚合數據,表示這些列的最后一個值。
僅輸出具有值的最新行:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.