迭代PANDAS中的唯一值

时间:2016-03-09 14:37:36

标签: python 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

非常感谢任何帮助或指示。

3 个答案:

答案 0 :(得分:0)

我认为您可以使用to_numeric将值.转换为NaN,然后使用groupbyrank创建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)

我认为您正在寻找pandas groupby

例如,df.groubpy('Patient').last()将返回一个DataFrame,其中包含每个患者的最后一次观察。如果患者未按date排序,您可以使用max功能找到最新的记录日期。

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

您可以创建自己的功能,然后调用groupbyapply()功能。