다음과 같은 데이터 프레임이 있습니다.
USUBJID IDVAR IDVARVAL QNAM QVAL
0 Dummy-01-0001 AESEQ 1.0 AEdummy1 2012-02-15
1 Dummy-01-0002 AESEQ 1.0 AEdummy1 2012-02-23
2 Dummy-01-0004 AESEQ 1.0 AEdummy1 2012-02-06
3 Dummy-01-0004 AESEQ 2.0 AEdummy1 2012-03-10
4 Dummy-01-0005 AESEQ 1.0 AEdummy1 2012-03-10
5 Dummy-01-0001 AESPID 1 dummy2AE Gastrointestinal disorders
6 Dummy-01-0002 AESPID 1 dummy2AE Nervous system disorder
7 Dummy-01-0004 AESPID 2 dummy2AE Gastrointestinal disorders
8 Dummy-01-0004 AESPID 1 dummy2AE Nervous system disorder
9 Dummy-01-0005 AESPID 1 dummy2AE Gastrointestinal disorders
위의 데이터 프레임은 단순한 smaple입니다. 다음 코드를 사용하여 데이터 프레임에 더 많은 데이터를 가져 오십시오. ( 업데이트 된 데이터 )
df = pd.DataFrame({'USUBJID': {0: 'Dummy-01-0001', 1: 'Dummy-01-0002', 2: 'Dummy-01-0004', 3: 'Dummy-01-0004', 4: 'Dummy-01-0005', 5: 'Dummy-01-0007', 6: 'Dummy-01-0008', 7: 'Dummy-01-0008', 8: 'Dummy-01-0010', 9: 'Dummy-01-0010', 10: 'Dummy-01-0011', 11: 'Dummy-01-0011', 12: 'Dummy-01-0013', 13: 'Dummy-01-0013', 14: 'Dummy-01-0014', 15: 'Dummy-01-0016', 16: 'Dummy-01-0016', 17: 'Dummy-01-0019', 18: 'Dummy-01-0001', 19: 'Dummy-01-0002', 20: 'Dummy-01-0004', 21: 'Dummy-01-0004', 22: 'Dummy-01-0005', 23: 'Dummy-01-0007', 24: 'Dummy-01-0008', 25: 'Dummy-01-0008', 26: 'Dummy-01-0010', 27: 'Dummy-01-0010', 28: 'Dummy-01-0011', 29: 'Dummy-01-0011', 30: 'Dummy-01-0013', 31: 'Dummy-01-0013', 32: 'Dummy-01-0014', 33: 'Dummy-01-0016', 34: 'Dummy-01-0016', 35: 'Dummy-01-0017', 36: 'Dummy-01-0017', 37: 'Dummy-01-0019'}, 'IDVAR': {0: 'AESEQ', 1: 'AESEQ', 2: 'AESEQ', 3: 'AESEQ', 4: 'AESEQ', 5: 'AESEQ', 6: 'AESEQ', 7: 'AESEQ', 8: 'AESEQ', 9: 'AESEQ', 10: 'AESEQ', 11: 'AESEQ', 12: 'AESEQ', 13: 'AESEQ', 14: 'AESEQ', 15: 'AESEQ', 16: 'AESEQ', 17: 'AESEQ', 18: 'AESPID', 19: 'AESPID', 20: 'AESPID', 21: 'AESPID', 22: 'AESPID', 23: 'AESPID', 24: 'AESPID', 25: 'AESPID', 26: 'AESPID', 27: 'AESPID', 28: 'AESPID', 29: 'AESPID', 30: 'AESPID', 31: 'AESPID', 32: 'AESPID', 33: 'AESPID', 34: 'AESPID', 35: 'AESPID', 36: 'AESPID', 37: 'AESPID'}, 'IDVARVAL': {0: '1.0', 1: '1.0', 2: '1.0', 3: '2.0', 4: '1.0', 5: '1.0', 6: '1.0', 7: '2.0', 8: '1.0', 9: '2.0', 10: '1.0', 11: '2.0', 12: '1.0', 13: '2.0', 14: '1.0', 15: '1.0', 16: '2.0', 17: '1.0', 18: '1', 19: '1', 20: '2', 21: '1', 22: '1', 23: '1', 24: '1', 25: '2', 26: '2', 27: '1', 28: '1', 29: '2', 30: '1', 31: '2', 32: '1', 33: '1', 34: '2', 35: '1', 36: '2', 37: '1'}, 'QNAM': {0: 'AEdummy1', 1: 'AEdummy1', 2: 'AEdummy1', 3: 'AEdummy1', 4: 'AEdummy1', 5: 'AEdummy1', 6: 'AEdummy1', 7: 'AEdummy1', 8: 'AEdummy1', 9: 'AEdummy1', 10: 'AEdummy1', 11: 'AEdummy1', 12: 'AEdummy1', 13: 'AEdummy1', 14: 'AEdummy1', 15: 'AEdummy1', 16: 'AEdummy1', 17: 'AEdummy1', 18: 'dummy2AE', 19: 'dummy2AE', 20: 'dummy2AE', 21: 'dummy2AE', 22: 'dummy2AE', 23: 'dummy2AE', 24: 'dummy2AE', 25: 'dummy2AE', 26: 'dummy2AE', 27: 'dummy2AE', 28: 'dummy2AE', 29: 'dummy2AE', 30: 'dummy2AE', 31: 'dummy2AE', 32: 'dummy2AE', 33: 'dummy2AE', 34: 'dummy2AE', 35: 'dummy2AE', 36: 'dummy2AE', 37: 'dummy2AE'}, 'QVAL': {0: '2012-02-15', 1: '2012-02-23', 2: '2012-02-06', 3: '2012-03-10', 4: '2012-03-10', 5: '2012-02-08', 6: '2012-03-18', 7: '2012-03-07', 8: '2012-02-01', 9: '2012-01-10', 10: '2012-01-19', 11: '2012-03-28', 12: '2012-02-19', 13: '2012-02-14', 14: '2012-03-13', 15: '2012-03-08', 16: '2012-02-05', 17: '2012-03-18', 18: 'Gastrointestinal disorders', 19: 'Nervous system disorder', 20: 'Gastrointestinal disorders', 21: 'Nervous system disorder', 22: 'Gastrointestinal disorders', 23: 'Vascular disorders', 24: 'Gastrointestinal disorders', 25: 'Vascular disorders', 26: 'Nervous system disorder', 27: 'Gastrointestinal disorders', 28: 'Nervous system disorder', 29: 'Nervous system disorder', 30: 'Nervous system disorder', 31: 'Gastrointestinal disorders', 32: 'Gastrointestinal disorders', 33: 'Vascular disorders', 34: 'Gastrointestinal disorders', 35: 'Nervous system disorder', 36: 'Nervous system disorder', 37: 'Vascular disorders'}})
구조를 조금 이해합시다. IDVAR 은 변수 명을 보유 하고 IDVARVAL 은 해당 값을 보유하고, QNAM 은 다른 변수 명을 보유 하고 QVAL 은 해당 값을 보유합니다. 이 구조는 내가 작업중인 도메인에서 정규화 된 구조라고합니다. 그래도 이상하다는 것을 알고 있습니다. 이 데이터를 다음 형식으로 얻고 싶습니다.
USUBJID AESEQ AESPID AEdummy1 dummy2AE
0 Dummy-01-0001 1.0 1 2012-02-15 Gastrointestinal disorders
1 Dummy-01-0002 1.0 1 2012-02-23 Nervous system disorder
2 Dummy-01-0004 1.0 2 2012-02-06 Gastrointestinal disorders
3 Dummy-01-0004 2.0 1 2012-03-10 Nervous system disorder
4 Dummy-01-0005 1.0 1 2012-03-10 Gastrointestinal disorders
QNAM과 QVAL에 대해서만해야한다면 문제 없습니다. 다음과 같이 pandas의 피벗을 사용하여 쉽게 할 수 있습니다.
df.pivot(
index=['USUBJID', 'IDVARVAL', 'IDVAR'],
columns='QNAM',
values='QVAL'
).reset_index()
이 문제에 대해서도 일종의 마스킹을 사용할 수 있지만이 데이터에는 수천 또는 때로는 수백만 개의 레코드가있을 것이기 때문에 이것이 가장 효율적인 방법이 아닐 것임을 알고 있습니다.
참고 : IDVAR에 대한 USUBJID 및 IDVARVAL의 조합은 QNAM에 대한 QVAL 값에 매핑되어야합니다. 즉, AESEQ, AESPID, AEdummy1 및 dummy2AE에 대한 일부 레코드는 NAN이거나 출력 DataFrame에 대해 비어있을 수 있습니다. 즉, 위 샘플의 경우 Dummy-01-0001 및 AESEQ = 1.0 은 AEdummy1 = 2012-02-15를 고유하게 식별합니다.
우리가 함께 해보자 unstacking
다음 concat
:
s = df.set_index([df.groupby('IDVAR').cumcount(), 'USUBJID'])
s1 = s.set_index('IDVAR', append=True)['IDVARVAL'].unstack()
s2 = s.set_index('QNAM', append=True)['QVAL'].unstack()
out = pd.concat([s1, s2], axis=1).reset_index(level=1)
데이터 프레임을 그룹화 IDVAR
하고 사용 cumcount
하여 순차 카운터를 만들어 IDVAR
그룹당 행을 고유하게 식별 한 다음이 카운터를 열과 함께 USUBJID
데이터 프레임의 인덱스로 설정합니다.
>>> s
IDVAR IDVARVAL QNAM QVAL
USUBJID
0 Dummy-01-0001 AESEQ 1.0 AEdummy1 2012-02-15
1 Dummy-01-0002 AESEQ 1.0 AEdummy1 2012-02-23
2 Dummy-01-0004 AESEQ 1.0 AEdummy1 2012-02-06
3 Dummy-01-0004 AESEQ 2.0 AEdummy1 2012-03-10
4 Dummy-01-0005 AESEQ 1.0 AEdummy1 2012-03-10
0 Dummy-01-0001 AESPID 1.0 dummy2AE Gastrointestinal disorders
1 Dummy-01-0002 AESPID 1.0 dummy2AE Nervous system disorder
2 Dummy-01-0004 AESPID 2.0 dummy2AE Gastrointestinal disorders
3 Dummy-01-0004 AESPID 1.0 dummy2AE Nervous system disorder
4 Dummy-01-0005 AESPID 1.0 dummy2AE Gastrointestinal disorders
이제 각각의 컬럼 IDVARVAL
과 QVAL
해당 컬럼을 추가하여 인덱스 업데이트 IDVAR
및 QNAM
다음 unstack
바꿀를 :
>>> s1
IDVAR AESEQ AESPID
USUBJID
0 Dummy-01-0001 1.0 1.0
1 Dummy-01-0002 1.0 1.0
2 Dummy-01-0004 1.0 2.0
3 Dummy-01-0004 2.0 1.0
4 Dummy-01-0005 1.0 1.0
>>> s2
QNAM AEdummy1 dummy2AE
USUBJID
0 Dummy-01-0001 2012-02-15 Gastrointestinal disorders
1 Dummy-01-0002 2012-02-23 Nervous system disorder
2 Dummy-01-0004 2012-02-06 Gastrointestinal disorders
3 Dummy-01-0004 2012-03-10 Nervous system disorder
4 Dummy-01-0005 2012-03-10 Gastrointestinal disorders
마지막으로, concat
위의 스택되지 않은 프레임 s1
과 s2
함께 axis=1
원하는 결과를 얻으십시오.
>>> out
USUBJID AESEQ AESPID AEdummy1 dummy2AE
0 Dummy-01-0001 1.0 1.0 2012-02-15 Gastrointestinal disorders
1 Dummy-01-0002 1.0 1.0 2012-02-23 Nervous system disorder
2 Dummy-01-0004 1.0 2.0 2012-02-06 Gastrointestinal disorders
3 Dummy-01-0004 2.0 1.0 2012-03-10 Nervous system disorder
4 Dummy-01-0005 1.0 1.0 2012-03-10 Gastrointestinal disorders
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다