분석 전에 표를 믿을 수 있는 모양으로 만들어 두는 일 — 지루하지만 생략하면 반드시 탈이 납니다.
코드랩의 원본에는 표를 읽자마자 이런 세 줄이 나옵니다.
df = df.groupby(level=0).sum() # 같은 유전자 이름을 합친다
counts = df[WT + KD].astype(float)
얼핏 군더더기처럼 보이지만, 셋 다 이유가 있는 안전장치입니다.
① 같은 이름이 두 번 나오면?
유전자 이름표는 생각보다 지저분합니다. 하나의 유전자가 여러 조각으로 측정되거나,
이름이 바뀌는 과정에서 같은 이름의 행이 두 개 생기는 일이 흔해요.
그대로 두면 df.loc["Ddx54"] 가 한 줄이 아니라 표를 돌려주고,
그 뒤 코드가 전부 이상하게 꼬입니다.
df.groupby(level=0).sum()
└ level=0 = "행 이름표를 기준으로 묶어라"
groupby(level=0) 는 같은 행 이름끼리 묶고, .sum() 이 그 값을 더합니다.
같은 유전자에서 읽은 개수는 더하는 것이 맞으니까요.
② 쓸 열만, 정한 순서대로
df[WT + KD] 는 열을 고르고 동시에 순서를 정합니다.
파일에 적힌 순서가 어떻든, 우리 표는 항상 앞 4개가 WT · 뒤 3개가 KD 가 됩니다.
13강에서 cols[:4], cols[4:] 로 두 그룹을 자를 때
이 약속이 그대로 쓰입니다.
③ 정수를 실수로
.astype(float) — 개수는 정수지만, 곧 나눗셈(CPM)과 로그를 씌울 겁니다.
정수인 채로 두면 파이썬 버전·numpy 설정에 따라 나눗셈이 잘려 나가는 사고가 날 수 있어요.
미리 실수로 바꿔 둡니다.
세 줄을 지나면 표가 '믿을 수 있는 모양'이 됩니다.
🎮 중복이 있으면 어떻게 되는지 만들어 보기
일부러 같은 이름의 행을 넣고 groupby(level=0).sum() 을 켜고 꺼 보세요.
.loc 가 돌려주는 것이 한 줄에서 표로 바뀌는 순간이 보입니다.
🤔 확인 문제
df.groupby(level=0).sum() 에서 level=0 은 무엇을 가리키나요?
해설 level=0 은 행 이름표를 기준으로 묶으라는 뜻입니다. 열을 기준으로 묶는 것이 아닙니다.
🤔 확인 문제
df[WT + KD] 가 하는 일 두 가지는?
해설 필요한 열만 남기고, 동시에 WT 4개 → KD 3개 순서를 확정합니다. 이 순서 약속 덕분에 나중에 cols[:4] 로 그룹을 자를 수 있습니다.
🤔 확인 문제
.astype(float) 를 미리 해 두는 이유로 가장 알맞은 것은?
해설 다음 강에서 counts / lib * 1e6 같은 나눗셈을 합니다. 실수로 미리 바꿔 두면 자료형 때문에 값이 잘려 나가는 사고를 원천 차단할 수 있습니다.