簡體   English   中英

迭代 PANDAS 中的唯一值

[英]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 ,然后使用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

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

我認為您正在尋找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()函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM