Python 공부 기록-21

김시헌·2025년 5월 7일

필터링

다음 데이터프레임에서 현재가가 1500 이상인 값만 가져와보세요.

코드

data = [
    ["037730", "3R", 1510, 7.36],
    ["036360", "3SOFT", 1790, 1.65],
    ["005760", "ACTS", 1185, 1.28],
]
columns = ["종목코드", "종목명", "현재가", "등락률"]
df = pd.DataFrame(data=data, columns=columns)
df.set_index('종목코드', inplace=True)

df [df["현재가"]>=1500]

실행 결과

위 데이터프레임에서 현재가가 1,500원 이상이면서 1,700원 미만인 값만 필터링 해보세요.

df[ (df["현재가"]>=1500) & (df["현재가"]<1700) ]

실행 결과

DataFrame.query

데이터프레임 query 메서드를 사용하여 종가(close)가 시가(open)보다 큰 데이터만 가져오세요.
코드

data = [
    {"cd":"A060310", "nm":"3S", "open":2920, "close":2800},
    {"cd":"A095570", "nm":"AJ네트웍스", "open":1920, "close":1900},
    {"cd":"A006840", "nm":"AK홀딩스", "open":2020, "close":2010},
    {"cd":"A054620", "nm":"APS홀딩스", "open":3120, "close":3200}
]
df = pd.DataFrame(data=data)
df = df.set_index('cd')

df.query("close > open")

실행 결과

위 데이터프레임에서 종가(close)가 3,000원 이상인 종목만 출력하세요.

df.query('close >= 3000')

실행 결과

query 여러 조건

위 데이터프레임에서 시가(open)가 2,000원 이상이고 종가(close)가 시가(open)이상인 종목을 출력하세요.

df.query("open >= 2000 and close >= open")

실행 결과

query 와 str.startwith

위 데이터프레임에서 종목명(nm)이 'A'로 시작하는 종목만 선택하세요.

df.query("nm.str.startswith('A')")

실행 결과

query 와 str.contains

위 데이터프레임에서 종목명에 '홀딩스'가 포함된 종목만 선택하세요.

df.query("nm.str.contains('홀딩스')")

실행 결과

DataFrame filter

다음 데이터프레임에서 filter 메서드를 사용해서 "PER"과 "PBR" 컬럼만 선택하세요.
코드

data = {
    "PER": [6.42, 17.63, 21.09, 13.93],
    "PBR": [1.10, 1.49, 2.06, 1.88],
    "DPS": [1416, 1716, 2994, 1755]
}
index = ["2019/12", "2020/12", "2021/12", "2022/12(E)"]
df = pd.DataFrame(data=data, index=index)

df.filter(items=["PER", "PBR"])

실행 결과

DataFrame filter 정규식

위 데이터프레임에서 filter 메서드의 정규식을 사용해서 'PER'과 'PBR' 컬럼을 선택하세요.

df.filter(regex="P.R", axis=1)

실행 결과

데이터프레임 filter 정규식 (index)

위 데이터프레임에서 filter 메서드를 사용해서 예상치인 '2022/12(E)'를 제외한 나머지 로우 데이터를 선택하세요.

df.filter(regex="12$", axis=0)

실행 결과

데이터프레임 filter like

위 데이터프레임에서 "2022"년 데이터만 선택하세요. 2022년 데이터는 인덱스에 '2022'라는 문자열이 포함되어있습니다.

df.filter(like="2022", axis=0)

실행 결과

데이터터프레임 위/아래 붙이기 (concat)

df1, df2 데이터프레임을 위/아래 방향으로 연결하세요. (위에 df1이 있고 그 아래에 df2가 있어야합니다.)
코드

from datetime import datetime

columns = ['open', 'high', 'low', 'close']
index1 = [
    datetime(2022, 9, 8),
    datetime(2022, 9, 7),
    datetime(2022, 9, 6),
    datetime(2022, 9, 5),
    datetime(2022, 9, 2)
]

index2 = [
    datetime(2022, 9, 1),
    datetime(2022, 8, 31),
    datetime(2022, 8, 30),
    datetime(2022, 8, 29),
    datetime(2022, 8, 26)
]

df1 = pd.DataFrame(data=np.arange(0, 20).reshape(5,4), index=index1, columns=columns)
df2 = pd.DataFrame(data=np.arange(20,40).reshape(5,4), index=index2, columns=columns)

pd.concat([df1, df2], axis=0)

실행 결과

데이터터프레임 위/아래 붙이기 (concat)

위 df1, df2 데이터프레임을 위/아래 방향으로 연결하세요. (위에 df2가 있고 그 아래에 df1가 있어야합니다.)

pd.concat([df2, df1], axis=0)

실행 결과

데이터프레임 좌/우로 붙이기 (concat)

다음 df1, df2 데이터프레임을 좌/우로 붙여 새로운 데이터프레임을 생성하세요.
코드

index = [
    datetime(2022, 9, 8),
    datetime(2022, 9, 7),
    datetime(2022, 9, 6),
    datetime(2022, 9, 5),
    datetime(2022, 9, 2)
]

df1 = pd.DataFrame(data=np.arange(0, 10).reshape(5,2), index=index, columns=['open', 'high'])
df2 = pd.DataFrame(data=np.arange(10,20).reshape(5,2), index=index, columns=['low', 'close'])

pd.concat([df1, df2], axis=1)

실행 결과

DataFrame.concat

다음 df1, df2 데이터프레임을 위/아래로 연결하세요. concat 메서드에서 join='outer'를 사용하세요.
코드

index1 = [
    datetime(2022, 9, 8),
    datetime(2022, 9, 7)
]

index2 = [
    datetime(2022, 9, 6),
    datetime(2022, 9, 5)
]
df1 = pd.DataFrame(np.arange(0, 6).reshape(2,3), index=index1, columns=['open', 'high', 'low'])
df2 = pd.DataFrame(np.arange(6,12).reshape(2,3), index=index2, columns=['high', 'low', 'close'])

pd.concat([df1, df2], axis=0, join='outer')

실행 결과

DataFrame.concat (join parameter)

위 df1, df2 데이터프레임을 위/아래로 연결하세요. concat 메서드에서 join='inner'를 사용하세요.

pd.concat([df1, df2], axis=0, join='inner')

실행 결과

pd.concat series

다음 s1, s2 시리즈 객체를 위/아래로 연결하세요.
코드

s1 = pd.Series(['a', 'b'])
s2 = pd.Series(['c', 'd'])

pd.concat([s1, s2])

실행 결과

pd.concat series

다음 s1, s2 시리즈 객체를 좌/우로 연결하세요.
코드

s1 = pd.Series(['a', 'b'])
s2 = pd.Series(['c', 'd'])

pd.concat([s1, s2], axis=1)

실행 결과

pd.concat & ignore_index

다음 df1, df2를 concat 메서드로 위/아래로 붙일 때 인덱스를 무시하고 연결하세요.
코드

df1 = pd.DataFrame(np.arange(0, 4).reshape(2,2))
df2 = pd.DataFrame(np.arange(4, 8).reshape(2,2))

pd.concat([df1, df2], ignore_index=True)

실행 결과

pd.concat 멀티인덱스

df1, df2 데이터프레임을 concat 메서드로 위/아래로 연결할 때 다음 그림과 같이 멀티인덱스로 구성하세요.

코드

index = ["2020", "2021"]

data1 = {
    "PER": [21.09, 13.55],
    "PBR": [2.06, 1.80]
}

data2 = {
    "PER": [12.40, 24.19],
    "PBR": [1.58, 1.44]
}

df1 = pd.DataFrame(data=data1, index=index)
df2 = pd.DataFrame(data=data2, index=index)

pd.concat([df1, df2], axis=0, keys=['삼성전자','LG전자'])

실행 결과

pd.concat (names parameter)

위 df1, df2 데이터프레임을 다음 그림과 같이 연결하세요. 멀티 인덱스 이름을 지정하세요.

pd.concat([df1, df2], axis=0, keys=['삼성전자','LG전자'], names=['종목명', '연도'])

실행 결과

DataFrame.groupby mean

다음 데이터프레임에서 테마별 PER, PBR의 평균을 계산하세요.
코드

data = [
    ["2차전지(생산)", "SK이노베이션", 10.19, 1.29],
    ["해운", "팬오션", 21.23, 0.95],
    ["시스템반도체", "티엘아이", 35.97, 1.12],
    ["해운", "HMM", 21.52, 3.20],
    ["시스템반도체", "아이에이", 37.32, 3.55],
    ["2차전지(생산)", "LG화학", 83.06, 3.75]
]

columns = ["테마", "종목명", "PER", "PBR"]
df = pd.DataFrame(data=data, columns=columns)

df.groupby(by="테마")[["PER", "PBR"]].mean() 

실행 결과

0개의 댓글