2025-05-07

장상희·2025년 5월 7일
0

파이썬

목록 보기
20/31

1.query[str.startwith, str.endwith, str.contain, filter**]**

2.concat

예시문제

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 = DataFrame(data=data)
df = df.set_index('cd')

>>
             nm  open  close
cd                          
A060310      3S  2920   2800
A095570  AJ네트웍스  1920   1900
A006840   AK홀딩스  2020   2010
A054620  APS홀딩스  3120   3200

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

df.query("close > open")#query문은 비교연산자를 문자열로 해도 다 알아 먹는다 이문제를 풀어서 해결하면

str = ("close > open")
df.query(str)

>>

nm	open	close
cd			
A054620	APS홀딩스	3120	3200

#위와 같이도 할 수 있다

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

df.query("close > open" and "open > 2000") #and, or 등 여러개의 비교연산자도 한번에 할 수 있다

>>

nm	open	close
cd			
A060310	3S	2920	2800
A006840	AK홀딩스	2020	2010
A054620	APS홀딩스	3120	3200

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

print(df.query("nm.str.startswith('A')"))#str.startswith() 앞 글자에 xx이 포함되었는지

>>

nm	open	close
cd			
A095570	AJ네트웍스	1920	1900
A006840	AK홀딩스	2020	2010
A054620	APS홀딩스	3120	3200

#이름에 홀딩스가 포함된것만 출력
print(df.query("nm.str.contains('홀딩스')"))#str.contains() ***이 포함했는지 확인하는 함수
>>
	nm	open	close
cd			
A006840	AK홀딩스	2020	2010
A054620	APS홀딩스	3120	3200

---------------------------------------
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)
>>
              PER   PBR   DPS
2019/12      6.42  1.10  1416
2020/12     17.63  1.49  1716
2021/12     21.09  2.06  2994
2022/12(E)  13.93  1.88  1755

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

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

>>
PER	PBR
2019/12	6.42	1.10
2020/12	17.63	1.49
2021/12	121.09	2.06
2022/12(E)	13.93	1.88

#DataFrame filter 정규식
df.filter(regex="P.R", axis=1)#Column에서 P,R이 포함된 걸 출력한
>>
	PER	PBR
2019/12	6.42	1.10
2020/12	17.63	1.49
2021/12	21.09	2.06
2022/12(E)	13.93	1.88

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

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

PER	PBR	DPS
2019/12	6.42	1.10	1416
2020/12	17.63	1.49	1716
2021/12	21.09	2.06	2994

#위 데이터프레임에서 "2022"년 데이터만 선택하세요. 2022년 데이터는 인덱스에 '2022'라는 문자열이 포함되어있습니다.
df.filter(like="2022", axis=0)

---------------------

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

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)

            open  high  low  close
2022-09-08     0     1    2      3
2022-09-07     4     5    6      7
2022-09-06     8     9   10     11
2022-09-05    12    13   14     15
2022-09-02    16    17   18     19

#df1 df2 붙이기(위 아래로)
pd.concat([df1, df2], axis=0)
>>

open	high	low	close
2022-09-08	0	1	2	3
2022-09-07	4	5	6	7
2022-09-06	8	9	10	11
2022-09-05	12	13	14	15
2022-09-02	16	17	18	19
2022-09-01	20	21	22	23
2022-08-31	24	25	26	27
2022-08-30	28	29	30	31
2022-08-29	32	33	34	35
2022-08-26	36	37	38	39

#좌 우로 붙이기
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)

--------------------------

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'])

#outer,inner를 써보
pd.concat([df1, df2], axis=0, join='outer')
>>

open	high	low	close
2022-09-08	0.0	1.0	NaN	NaN
2022-09-07	2.0	3.0	NaN	NaN
2022-09-06	4.0	5.0	NaN	NaN
2022-09-05	6.0	7.0	NaN	NaN
2022-09-02	8.0	9.0	NaN	NaN
2022-09-08	NaN	NaN	10.0	11.0
2022-09-07	NaN	NaN	12.0	13.0
2022-09-06	NaN	NaN	14.0	15.0
2022-09-05	NaN	NaN	16.0	17.0
2022-09-02	NaN	NaN	18.0	19.0

pd.concat([df1, df2], axis=0, join='inner')
>>
2022-09-08
2022-09-07
2022-09-06
2022-09-05
2022-09-02
2022-09-08
2022-09-07
2022-09-06
2022-09-05
2022-09-02

#새로운 데이터프레임 두개 생성
df1 = pd.DataFrame(np.arange(0, 4).reshape(2,2))
df2 = pd.DataFrame(np.arange(4, 8).reshape(2,2))

#axis를 False 해서 출력
pd.concat([df1, df2], axis= False)
>>
0	1
0	0	1
1	2	3
0	4	5
1	6	7

#pd.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)
>>

        PER   PBR
2020  21.09  2.06
2021  13.55  1.80
        PER   PBR
2020  12.40  1.58
2021  24.19  1.44

#멀티인덱스 붙이기

combined = pd.concat([df1, df2], keys=["삼성전자", "LG전자"])#keys 함수를 붙이면 자동으로 만들어진다
print(combined)

>>
             PER   PBR
삼성전자 2020  21.09  2.06
     2021  13.55  1.80
LG전자 2020  12.40  1.58
     2021  24.19  1.44
     
     
#회사와 연도까지 붙이기
combined = pd.concat([df1, df2], keys=["삼성전자", "LG전자"])
combined.index.names = ["회사", "연도"]
print(combined)

**>>

             PER   PBR
회사   연도               
삼성전자 2020  21.09  2.06
     2021  13.55  1.80
LG전자 2020  12.40  1.58
     2021  24.19  1.44
    
    
    
 ------------------------------
 #groupby 
 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)

>>**

	테마	종목명	PER	PBR
0	2차전지(생산)	SK이노베이션	10.19	1.29
1	         해운	팬오션	21.23	0.95
2	시스템반도체	티엘아이	35.97	1.12
3	            해운	HMM	21.52	3.20
4	시스템반도체	아이에이	37.32	3.55
5	2차전지(생산)	LG화학	83.06	3.75

df.groupby(by="테마")[["PER","PBR"]].mean
profile
프로그래머 꿈나무

0개의 댓글