我有以下格式的数据集:
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
非常感谢任何帮助或指示。
答案 0 :(得分:0)
我认为您可以使用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
答案 1 :(得分:0)
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
答案 2 :(得分:0)