2016-03-09 81 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()功能。