02단계 · 표 다루기 (pandas)
문자열 열 다루기 — 대소문자 함정
`.str` 로 열 전체에 문자열 기능을 걸고, `case=False` 의 필요를 직접 확인한다.
먼저 알아볼게요
코드로 이동 ↓열 전체에 문자열 기능을 걸 때는 .str 을 한 번 거친다: df["이름"].str.upper(). .str 없이 df["이름"].upper() 라고 쓰면 오류다.
df["이름"].str[0] 은 각 값의 첫 글자다. 성씨만 뽑는 것이 이 모양이다. .str[:2] 는 앞 두 글자다.
.str.contains("서") 는 그 글자가 들어 있는지 True/False 로 알려 준다. startswith·endswith 도 같은 방식이다.
`contains` 는 기본적으로 대소문자를 구분한다. "PREM" 으로 찾으면 "premium" 은 걸리지 않는다. 대소문자를 무시하려면 case=False 를 붙인다.
공개된 응시 후기에도 대소문자를 구분하지 않는 문자열 조건이 언급된 적이 있다(개인 회고이지 공식 기출은 아니다). 영문 범주 열에 조건을 걸 때는 대소문자가 섞여 있지 않은지 unique() 로 먼저 확인하는 편이 안전하다.
이렇게 써요
import pandas as pd
df = pd.read_csv("emp.csv")
print(df["이름"].str[:2].head(3).tolist())
print(df[df["이름"].str.endswith("우")].shape[0])기억할 한 가지
contains 는 기본이 대소문자 구분이다. 영문 조건에는 case=False 를 의심하고 확인한다.
직접 해보기
emp.csv 에서 ① 성씨(첫 글자)의 종류 수 ② 이름에 서 가 들어간 행 수를 출력하고, churn_train.csv 에서 ③ 요금제 를 대문자로 바꾼 값들을 정렬한 리스트 ④ PREM 을 대소문자 무시로 포함하는 행 수 ⑤ 같은 조건을 대소문자 구분해서 센 행 수를 출력하세요.
제공 파일 2개 · 내용 보기
파일은 준비되어 있어요. 코드에서 이름으로 불러오세요.
emp.csv
사번,이름,부서,직급,연봉,근속연수,고객만족도,입사일 1001,김서준,인사,사원,3230,2,3.8,2024-08-28 1002,이지우,인사,사원,4083,3,4.2,2023-07-26 1003,박도윤,인사,사원,3222,1,3.4,2025-09-24 1004,최하은,지원,부장,7395,18,4.6,2008-06-09 1005,정예준,영업,부장,8075,17,,2009-05-20 1006,강수아,인사,부장,7466,18,4.7,2008-06-01 1007,조민준,지원,대리,4558,5,4.7,2021-01-28 1008,윤지아,영업,과장,5796,,4.6,2015-04-13 1009,장시우,지원,과장,5878,13,4.6,2013-12-15 1010,임하윤,지원,대리,4686,9,3.3,2017-05-19 1011,한도현,지원,부장,7426,20,4.3,2006-07-27 1012,오채원,영업,사원,3545,4,,2022-06-25 1013,신건우,영업,사원,3724,1,3.8,2025-02-19 1014,권서연,영업,대리,4327,7,3.2,2019-05-06 1015,황준서,개발,부장,7732,21,4.7,2005-05-13 1016,안다은,영업,사원,3823,4,4.2,2022-01-13 1017,송지호,개발,부장,7262,19,4.4,2007-07-27 1018,전유진,지원,과장,6006,15,3.6,2011-03-16 1019,홍현우,개발,과장,5806,14,4.7,2012-10-17 1020,문소율,지원,사원,4008,,3.2,2023-01-06 1021,양지훈,개발,부장,7754,13,3.4,2013-07-10 1022,배가은,개발,과장,5483,13,3.4,2013-03-21 1023,백태윤,지원,사원,3510,4,4.1,2022-10-07 1024,유서윤,인사,사원,3477,2,,2024-06-22 1025,남주원,지원,사원,3581,1,3.3,2025-06-12 1026,노예린,영업,대리,4410,4,4.9,2022-06-04 1027,하시윤,지원,부장,7820,21,3.6,2005-04-15 1028,구다인,인사,사원,3846,1,3.2,2025-11-08 1029,서준혁,인사,대리,4549,4,3.2,2022-06-24 1030,민하율,개발,부장,7903,15,3.2,2011-12-03
churn_train.csv
고객ID,성별,요금제,가입개월,월요금,부가서비스,이탈 C1001,남,standard,22,44300,3,1 C1002,여,premium,1,62000,1,1 C1003,남,premium,45,64000,0,1 C1004,남,basic,10,32200,1,1 C1005,남,premium,5,69500,0,1 C1006,여,basic,56,29500,0,0 C1007,여,premium,48,62800,2,0 C1008,여,standard,5,56700,1,1 C1009,여,basic,49,30600,3,0 C1010,여,premium,52,74800,2,1 C1011,여,basic,19,32800,2,1 C1012,여,standard,18,42200,3,0 C1013,남,standard,37,47900,1,0 C1014,남,basic,1,30500,4,1 C1015,여,standard,52,43200,0,0 C1016,남,premium,31,75300,3,1 C1017,여,basic,22,29100,1,1 C1018,남,standard,39,48400,1,1 C1019,남,premium,35,82500,0,0 C1020,남,standard,19,42600,3,0 C1021,남,basic,22,27300,4,1 C1022,여,basic,38,27800,1,1 C1023,남,standard,5,54200,0,1 C1024,여,premium,36,77200,3,0 C1025,여,standard,14,46500,1,1 C1026,남,premium,15,64500,2,1 C1027,남,basic,45,28100,4,0 C1028,남,standard,49,40600,1,1 C1029,남,standard,59,50800,4,0 C1030,여,basic,16,27800,3,1 C1031,남,basic,36,24900,0,1 C1032,남,basic,17,30200,4,0 C1033,여,basic,36,29900,3,1 C1034,남,basic,36,23800,2,0 C1035,여,standard,9,50200,1,1 C1036,여,premium,45,60800,2,0 C1037,여,standard,37,42900,3,0 C1038,여,basic,37,24800,2,0 C1039,남,standard,42,46300,0,0 C1040,여,basic,34,28400,2,1 C1041,남,premium,11,84200,3,1 C1042,남,standard,9,57000,4,1 C1043,여,standard,11,43500,3,1 C1044,여,basic,42,29200,2,1 C1045,여,premium,10,66800,4,1 C1046,남,premium,56,62700,2,0 C1047,남,standard,19,44100,3,1 C1048,여,basic,14,33700,2,0 C1049,여,basic,44,28800,0,1 C1050,여,premium,32,69800,0,1 C1051,남,basic,52,24100,3,0 C1052,남,standard,48,35900,1,0 C1053,여,basic,41,26300,0,0 C1054,여,basic,36,25500,1,1 C1055,여,basic,7,29000,3,0 C1056,여,basic,34,32700,3,1 C1057,남,standard,42,48900,4,1 C1058,여,basic,32,25800,1,1 C1059,남,standard,56,50100,3,0 C1060,여,standard,28,41500,1,0 C1061,여,premium,47,73900,0,0 C1062,남,premium,4,53900,3,1 C1063,여,premium,4,72600,0,1 C1064,여,basic,42,29100,4,1 C1065,남,basic,59,29800,4,0 C1066,남,premium,28,75100,1,0 C1067,남,basic,27,27200,0,0 C1068,남,basic,60,30100,2,1 C1069,여,premium,4,67400,1,1 C1070,여,basic,4,34100,0,1 C1071,남,standard,42,40800,4,0 C1072,여,premium,53,72900,4,0 C1073,남,standard,36,37500,1,0 C1074,남,standard,44,49800,0,0 C1075,남,basic,5,29700,3,1 C1076,남,premium,1,75600,3,1 C1077,남,standard,44,40600,1,1 C1078,여,basic,7,23800,1,0 C1079,여,premium,47,66100,4,1 C1080,남,standard,32,41500,1,0 C1081,남,premium,37,78500,4,1 C1082,남,premium,52,68500,1,0 C1083,남,premium,51,61900,3,1 C1084,남,basic,38,30000,2,1 C1085,남,basic,12,30900,0,0 C1086,남,premium,25,74900,1,1 C1087,여,standard,40,47300,1,0 C1088,남,standard,6,41600,1,1 C1089,남,premium,57,64200,4,0 C1090,여,basic,42,28700,0,1 C1091,여,standard,27,37300,0,1 C1092,남,basic,27,25900,2,1 C1093,여,basic,41,27900,0,0 C1094,남,standard,60,44200,0,0 C1095,남,premium,12,67100,2,1 C1096,남,standard,46,45700,1,0 C1097,여,standard,23,48800,1,1 C1098,남,premium,57,75300,4,0 C1099,남,premium,13,53900,0,0 C1100,여,premium,29,61600,3,1 C1101,남,standard,2,47300,3,1 C1102,남,standard,10,55900,1,1 C1103,남,premium,3,71800,1,1 C1104,남,premium,53,70000,1,0 C1105,남,premium,32,71300,2,1 C1106,남,premium,9,66000,0,1 C1107,여,premium,30,66100,2,1 C1108,남,standard,43,53500,3,0 C1109,남,basic,26,29400,4,0 C1110,여,standard,21,48500,4,0 C1111,남,standard,51,42400,0,1 C1112,남,premium,21,74100,4,0 C1113,남,premium,56,56600,0,0 C1114,남,standard,46,45300,4,0 C1115,여,standard,48,42300,4,0 C1116,여,basic,35,24700,4,1 C1117,여,premium,22,42700,1,0 C1118,남,standard,9,39900,4,1 C1119,남,premium,36,73100,1,0 C1120,여,premium,38,73800,0,1 C1121,여,standard,13,49300,4,0 C1122,남,basic,48,30300,0,0 C1123,남,standard,16,43800,0,1 C1124,남,premium,15,74000,2,1 C1125,남,basic,25,30200,0,1 C1126,남,basic,44,33000,2,1 C1127,남,basic,56,21800,3,0 C1128,남,standard,48,38600,1,0 C1129,여,premium,15,68200,0,1 C1130,여,basic,28,27400,3,0 C1131,남,standard,54,40800,4,0 C1132,남,basic,45,26900,3,0 C1133,여,premium,21,66200,0,1 C1134,여,premium,39,58900,0,0 C1135,남,basic,43,29000,3,0 C1136,남,standard,9,48600,4,1 C1137,남,basic,28,30300,1,0 C1138,남,premium,30,78600,4,0 C1139,남,basic,18,23900,3,0 C1140,남,standard,46,40900,2,1 C1141,남,premium,6,70300,0,1 C1142,남,basic,46,29100,1,0 C1143,남,standard,18,41600,3,0 C1144,여,basic,53,27800,3,1 C1145,여,basic,7,25400,0,1 C1146,남,basic,27,28800,0,1 C1147,여,premium,51,64300,4,0 C1148,남,premium,25,53100,2,0 C1149,남,standard,54,43800,1,1 C1150,남,premium,40,57700,0,1 C1151,여,standard,24,42900,3,1 C1152,남,premium,21,63300,1,1 C1153,여,standard,44,34800,3,0 C1154,여,basic,29,27400,2,1 C1155,여,premium,38,61500,1,0 C1156,여,premium,48,62600,4,0 C1157,남,basic,27,26900,1,1 C1158,남,standard,20,38000,4,0 C1159,여,premium,22,63700,2,1 C1160,여,standard,20,42800,1,0
내 코드 Python
Python 준비 중… 처음 한 번만 내려받아요
들여쓰기: Tab · 편집기에서 나가기: Esc 다음 Tab
실행 결과
실행하면 코드가 출력한 내용이 여기에 나타나요.
막혔을 때
풀이와 비교하기
내 코드와 한 줄씩 비교해 보세요. 풀이를 보는 것만으로 완료되지는 않아요.
import pandas as pd
df = pd.read_csv("emp.csv")
print(df["이름"].str[0].nunique())
print(df[df["이름"].str.contains("서")].shape[0])
tr = pd.read_csv("churn_train.csv")
print(sorted(tr["요금제"].str.upper().unique().tolist()))
print(tr[tr["요금제"].str.contains("PREM", case=False)].shape[0])
print(tr[tr["요금제"].str.contains("PREM")].shape[0])