6

DataFrameいくつかの日付範囲の計算を適用したい次のものがあります。(sample_date からの) 一意の人物のサンプル間の日付の差が 8 週間未満である日付フレームの行を選択し、最も古い日付 (つまり、最初のサンプル) の行を保持したいと考えています。

これがデータセットの例です。実際のデータセットは 200,000 レコードを超える場合があります。

labno   name    sex dob         id     location  sample_date
1       John A  M   12/07/1969  12345  A         12/05/2112
2       John B  M   10/01/1964  54321  B         6/12/2010
3       James   M   30/08/1958  87878  A         30/04/2012
4       James   M   30/08/1958  45454  B         29/04/2012
5       Peter   M   12/05/1935  33322  C         15/07/2011
6       John A  M   12/07/1969  12345  A         14/05/2012
7       Peter   M   12/05/1935  33322  A         23/03/2011
8       Jack    M   5/12/1921   65655  B         15/08/2011
9       Jill    F   6/08/1986   65459  A         16/02/2012
10      Julie   F   4/03/1992   41211  C         15/09/2011
11      Angela  F   1/10/1977   12345  A         23/10/2006
12      Mark A  M   1/06/1955   56465  C         4/04/2011
13      Mark A  M   1/06/1955   45456  C         3/04/2011
14      Mark B  M   9/12/1984   55544  A         13/09/2012
15      Mark B  M   9/12/1984   55544  A         1/01/2012

ユニークな人物とは、名前と生年月日が同じ人物です。たとえば、John A、James、Mark A、および Mark B は一意の人物です。ただし、マーク A の id 値は異なります。

私は通常、手順に R を使用し、名前/DOB の組み合わせに基づいてデータフレームのリストを生成し、各データフレームを sample_date で並べ替えます。次に、リスト適用関数を使用して、各データフレーム内の最初のインデックスと最後のインデックスの日付の差が、最新の日付から 8 週間未満の場合に最も古いものを返すかどうかを判断します。それは永遠にかかります。

python/pandas でこれをどのように試みるかについて、いくつかの指針を歓迎します。まず、name/dob/id を使用して MultiIndex を作成しました。構造は私が望むものに見えます。私がする必要があるのは、R で使用する関数のいくつかを適用して、必要な行を選択することです。で選択してみましdf.xs()たが、あまりうまくいきません。

これは、パンダに簡単にロードできるデータの辞書です (ただし、列の順序は異なります)。

{'dob': {0: '12/07/1969'、1: '10/01/1964'、2: '30/08/1958'、3: '30/08/1958'、4: '12 /05/1935'、5:'12/07/1969'、6:'12/05/1935'、7:'5/12/1921'、8:'6/08/1986'、9:'4 /03/1992'、10:'1/10/1977'、11:'1/06/1955'、12:'1/06/1955'、13:'9/12/1984'、14:'9 /12/1984'}、'id': {0: 12345、1: 54321、2: 87878、3: 45454、
4:33322、5:12345、6:33322、7:65655、8:65459、9:41211、10:12345、11:56465、12:45456、13:55544、14:55544} 0:1、1:2、2:3、3:4、4:5、5:6、6:7、7:8、8:9、9:10、10:11、11:12、12: 13, 13: 14, 14: 15}, '場所': {0: 'A', 1: 'B', 2: 'A', 3: 'B', 4: 'C', 5: 'A' ', 6: 'A', 7: 'B', 8: 'A', 9: 'C', 10: 'A', 11: 'C', 12: 'C', 13: 'A', 14: 'A'}, 'name': {0: 'John A', 1: 'John B', 2: 'James', 3: 'James', 4: 'Peter', 5: 'John A' 、6:「ピーター」、7:「ジャック」、8:「ジル」、9:「ジュリー」、10:「アンジェラ」、11:「マークA」、
12: 'マーク A', 13: 'マーク B', 14: 'マーク B'}, 'sample_date': {0: '12/05/2112', 1: '6/12/2010', 2: ' 30/04/2012'、3:'29/04/2012'、4:'15/07/2011'、5:'14/05/2012'、6:'23/03/2011'、7:' 15/08/2011'、8:'16/02/2012'、9:'15/09/2011'、10:'23/10/2006'、11:'4/04/2011'、12:' 3/04/2011', 13: '13/09/2012', 14: '1/01/2012'}, '性別': {0: 'M', 1: 'M', 2: 'M' , 3: 'M', 4: 'M', 5: 'M', 6: 'M', 7: 'M', 8: 'F', 9: 'F',
10: 'F', 11 : 'M', 12: 'M', 13: 'M', 14: 'M'}}

4

1 に答える 1