在PANDAS中迭代唯一值

4
我有一个以下格式的数据集:
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

我认为你可以使用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

0

在pandas中有一个名为last的函数,可以与groupby一起使用,为给定的groupby提供最后的值。我不确定为什么您需要空白行,但如果您需要它们,可以将groupby重新加入原始数据帧。抱歉,排序是因为我的示例数据中日期没有排序。希望这有所帮助。

示例:

DataFrame

     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

0

我想你正在寻找 pandas groupby

例如,df.groubpy('Patient').last() 将返回每个 患者 的最后一个观测值的 DataFrame。如果患者没有按照 日期 排序,你可以使用 max 函数查找最新的记录日期。

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

你可以编写自己的函数,然后调用groupbyapply()函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接