2013-04-09 4 views
0

나는 issn, year, volume 및 issue가 포함 된 pulications에 대한 데이터를 가지고 있습니다. 따라서 예를 들어팬더를 사용하여 데이터에서 "간격"찾기

1234-x000, 2013, 1, 2 
1234-x000, 2013, 1, 1 
1234-x000, 2012, 6, 2 
1234-x000, 2012, 6, 1 
1234-x000, 2012, 5, 2 
.... 
4321-yyyy, 2013, 2, 1 
4321-yyyy, 2013, 1, 1 
4321-yyyy, 2012, 12, 1 
4321-yyyy, 2012, 11, 1 
.... 

누락 된 데이터를 식별하고 싶습니다. 한 가지 문제는 볼륨/이슈 구조가 항상 동일하지 않다는 점입니다. 그래서 한 발행에 대해 12 권의 발행물 또는 6 권의 발행물이있을 수 있습니다. 그러나 발행 된 발행물의 수는 고정되어 있다고 가정 할 수 있습니다.

팬더 지식은 여전히 ​​매우 기본입니다. 나는 영리한 판다 코드 몇 줄로 누락 된 가치를 알아낼 수 있어야한다는 느낌이 들지만, 나는 그것을 얻지 못한다. 어떤 힌트를 어떻게 해결할 수 있을까요?

+0

이 누락 된 데이터의 경우에 대한 몇 가지 예제를 줄 수 있습니까? – waitingkuo

+0

해당 연도에 볼륨 1,2,3,4,6,7, ... 12가있을 수 있습니다. 따라서 볼륨 5가 누락 될 수 있습니다. – Achim

+0

볼륨의 마지막 볼륨 또는 마지막 문제가 누락되면 어떻게합니까? – waitingkuo

답변

0

이것은 완전한 해결책이 아니며, 예를 들어 마지막 볼륨이 항상 존재한다고 가정합니다. 당신이 포인터를 요구하지만, 이것은 당신이 가야한다 :

In [28]: df 
Out[28]: 
     issn year vol issue 
0 1234-x000 2013 1  2 
1 1234-x000 2013 1  1 
2 1234-x000 2012 6  2 
3 1234-x000 2012 6  1 
4 1234-x000 2012 5  2 
5 4321-yyyy 2013 2  1 
6 4321-yyyy 2013 1  1 
7 4321-yyyy 2012 12  1 
8 4321-yyyy 2012 11  1 

In [29]: vols = df.groupby('issn').vol.max() 

In [30]: vols 
Out[30]: 
issn 
1234-x000  6 
4321-yyyy 12 
Name: vol 

In [31]: for k, g in df.groupby(['issn','year']): 
    ...:  print k 
    ...:  print 'missing: ', np.setdiff1d(np.arange(1, vols[k[0]]+1), 
    ...:            g.issue.values) 

출력 :

('1234-x000', 2012) 
missing: [ 3. 4. 5. 6.] 
('1234-x000', 2013) 
missing: [ 3. 4. 5. 6.] 
('4321-yyyy', 2012) 
missing: [ 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.] 
('4321-yyyy', 2013) 
missing: [ 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.] 
0

여기에 하나의 방법입니다. 나는 두 개의 열 'IDX'와 '최대'

In [452]: df['idx'] = df.groupby(['issn']).apply(lambda sdf: (sdf.volume - 1) * sdf.issue.max() + sdf.issue) 

In [453]: df 
Out[453]: 
     issn year volume issue idx 
0 1234-x000 2013  1  2 2 
1 1234-x000 2013  1  1 1 
2 1234-x000 2012  6  2 12 
3 1234-x000 2012  6  1 11 
4 1234-x000 2012  5  2 10 
5 4321-yyyy 2013  2  1 2 
6 4321-yyyy 2013  1  1 1 
7 4321-yyyy 2012  12  1 12 
8 4321-yyyy 2012  11  1 11 

In [454]: df['max'] = df.groupby(['issn']).idx.transform(lambda s: s.max()) 

In [455]: df 
Out[455]: 
     issn year volume issue idx max 
0 1234-x000 2013  1  2 2 12 
1 1234-x000 2013  1  1 1 12 
2 1234-x000 2012  6  2 12 12 
3 1234-x000 2012  6  1 11 12 
4 1234-x000 2012  5  2 10 12 
5 4321-yyyy 2013  2  1 2 12 
6 4321-yyyy 2013  1  1 1 12 
7 4321-yyyy 2012  12  1 12 12 
8 4321-yyyy 2012  11  1 11 12 

이전 답변 제공을 추가 나머지

In [462]: df.groupby(['issn', 'year']).apply(lambda sdf: np.setdiff1d(range(1, sdf['max'].irow(0)), sdf.idx).tolist()) 
Out[462]: 
issn  year 
1234-x000 2012  [1, 2, 3, 4, 5, 6, 7, 8, 9] 
      2013  [3, 4, 5, 6, 7, 8, 9, 10, 11] 
4321-yyyy 2012 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
      2013  [3, 4, 5, 6, 7, 8, 9, 10, 11] 
관련 문제