<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>smile_07.log</title>
        <link>https://velog.io/</link>
        <description>프로그래머 꿈나무</description>
        <lastBuildDate>Tue, 17 Jun 2025 11:27:10 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>smile_07.log</title>
            <url>https://velog.velcdn.com/images/smile_07/profile/8feed6c2-d0c5-4830-8c0d-f74164724e0d/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. smile_07.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/smile_07" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[2025-06-17]]></title>
            <link>https://velog.io/@smile_07/2025-06-17</link>
            <guid>https://velog.io/@smile_07/2025-06-17</guid>
            <pubDate>Tue, 17 Jun 2025 11:27:10 GMT</pubDate>
            <description><![CDATA[<h1 id="bar-그래프의-활용">Bar 그래프의 활용</h1>
<pre><code class="language-python">fig = go.Figure()
fig.add_trace(go.Bar(x=df[&#39;시군구명&#39;],y=df[&#39;총 의료시설수&#39;],name = &quot;총 의료시설수&quot;))
fig.add_trace(go.Bar(x=df[&#39;시군구명&#39;],y=df[&#39;약국 시설수&#39;],name = &quot;약국 시설수&quot;))
fig.update_xaxes(tickangle=60)
fig.update_layout(title_text=&#39;총 병원 수와 약국 시설 수&#39;)
fig.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/smile_07/post/07bd1e18-3a87-4f95-8ebb-b86348ff83a0/image.png" alt=""></p>
<h5 id="새로운-데이터-열-만들기">새로운 데이터 열 만들기</h5>
<pre><code class="language-python">총 병원 = [
    &#39;종합병원 시설수&#39;,
    &#39;일반병원 시설수&#39;,
    &#39;요양병원 시설수&#39;,
    &#39;치과병의원 시설수&#39;,
    &#39;한방병의원 시설수&#39;,
    &#39;일반의원 시설수&#39;,
    &#39;보건소 시설수&#39;
]
#
# 총 의료시설 수 컬럼 #.sum(axis=1)은 각 행마다 더해서 총합을 구합니다.
df[&#39;총 의료시설수&#39;] = df[총 병원].sum(axis=1)
print(df[[&#39;시군구명&#39;, &#39;총 의료시설수&#39;]])
&gt;&gt;
      시군구명  총 의료시설수
0   포항시 남구      258
1   포항시 북구      374
2      경주시      291
3      김천시      157
...
23     울릉군        8
</code></pre>
<h2 id="지하철-범죄-데이터-조회">지하철 범죄 데이터 조회</h2>
<pre><code class="language-python">df = pd.read_csv(&#39;경찰청_범죄 발생 장소별 통계-2.csv&#39;, encoding=&#39;UTF-8&#39;)
df = df[[&#39;지하철_전철&#39;, &#39;범죄대분류&#39;]].sort_values(by=&#39;지하철_전철&#39;, ascending=False)#sort_values 오름차순 정렬
fig = px.bar(df, x=&#39;지하철_전철&#39;, y=&#39;범죄대분류&#39;,orientation=&#39;h&#39;)
fig.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/smile_07/post/409bc03d-4e93-4b12-a0d2-e8034d6c78c8/image.png" alt=""></p>
<h2 id="부산광역시_영도구_동별-빈집현황">부산광역시_영도구_동별 빈집현황</h2>
<pre><code class="language-python">fig = px.bar(df, x=&#39;행정동명&#39;, y=&#39;빈집수(호)&#39;, text_auto=&#39;빈집수(호)&#39;)

fig.update_traces(textfont_size=12,textfont_color=&#39;white&#39;, textangle=0, textposition=&quot;inside&quot;)
fig.update_layout(title_text=&#39;부산광역시_영도구_동별 빈집현황&#39;)
fig.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/smile_07/post/e82e8a68-5810-4a00-bb66-c8cff0cd9e8b/image.png" alt=""></p>
<h2 id="강원랜드_게임기현황">강원랜드_게임기현황</h2>
<pre><code class="language-python">fig = px.bar(df, x=&quot;게임명&quot;, y=&quot;대수&quot;,pattern_shape=&quot;대수&quot;)

fig.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/smile_07/post/bdef2c29-d733-4914-8bed-2aabf103c1db/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[시각화 하기]]></title>
            <link>https://velog.io/@smile_07/%EC%8B%9C%EA%B0%81%ED%99%94-%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@smile_07/%EC%8B%9C%EA%B0%81%ED%99%94-%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 09 Jun 2025 13:46:59 GMT</pubDate>
            <description><![CDATA[<h1 id="부산광역시-인구-빅데이터">부산광역시 인구 빅데이터</h1>
<pre><code class="language-python">fig = px.bar(df, x =&#39; 구분 &#39;,y = &#39;  세대수  &#39;, title = &#39;부산광역시 인구현황&#39;)
fig.show()</code></pre>
<p>기본적인 동별 세대수</p>
<p><img src="attachment:920b18bd-955c-47f1-b194-72b8c37105eb:image.png" alt="image.png"></p>
<h2 id="동별-남여-인구수">동별 남,여 인구수</h2>
<pre><code class="language-python">fig = go.Figure()

fig = make_subplots(rows=1,cols=2)
fig.add_trace(go.Bar(x=df[&#39; 구분 &#39;],y=df[&#39;  인구수(남)  &#39;],name = &quot;인구(남)&quot;),row=1,col=1)
fig.add_trace(go.Bar(x=df[&#39; 구분 &#39;],y=df[&#39;  인구수(여)  &#39;],name = &quot;인구(여)&quot;),row=1,col=2)

fig.update_xaxes(tickangle=45, row=1, col=1)#tick angle = 눈금 각도, 글자의 각도를 수정할 수 있게 해준다
fig.update_xaxes(tickangle=45, row=1, col=2)

fig.show()</code></pre>
<p><img src="attachment:0edfed7f-fc85-4d29-bd5e-bec6566631b5:image.png" alt="image.png"></p>
<h2 id="부산동별-세대수-원그래프-시각화">부산동별 세대수 원그래프 시각화</h2>
<pre><code class="language-python">fig = px.pie(df, values = &#39;  세대수  &#39;,names = &#39; 구분 &#39;)
fig.update_layout(title = &quot;부산동별 세대수&quot;)
fig.show()</code></pre>
<p><img src="attachment:44314b4b-187a-442d-8d94-1f95440f4852:image.png" alt="image.png"></p>
<h2 id="꺾은-선">꺾은 선</h2>
<pre><code class="language-python">fig = px.scatter(df, x = &#39; 구분 &#39;, y = &#39;  세대수  &#39;)
fig.add_trace(go.Scatter(x=df[&#39; 구분 &#39;],y=df[&#39;  세대수  &#39;])name=&quot;세대수&quot;)

fig.update_xaxes(tickangle=0)
fig.show()</code></pre>
<p><img src="attachment:bbe7f10a-4d3d-4558-bfbd-9f8e9dd69081:image.png" alt="image.png"></p>
<h2 id="동별-인구를-4분활로-출력하기">동별 인구를 4분활로 출력하기</h2>
<pre><code class="language-python">fig = go.Figure()

fig = make_subplots(rows=2,cols=2, subplot_titles=(&quot;인구수(남)&quot;,&quot;인구수(여)&quot;,&quot;18세이상인구수(남)&quot;,&quot;18세이상인구수(여)&quot;))
fig.add_trace(go.Bar(x=df[&#39; 구분 &#39;],y=df[&#39;  인구수(남)  &#39;],name = &quot;인구(남)&quot;),row=1,col=1)
fig.add_trace(go.Bar(x=df[&#39; 구분 &#39;],y=df[&#39;  인구수(여)  &#39;],name = &quot;인구(여)&quot;),row=1,col=2)
fig.add_trace(go.Bar(x=df[&#39; 구분 &#39;],y=df[&#39;  18세이상인구수(남)  &#39;],name = &quot;18세이상인구(남)&quot;),row=2,col=1)
fig.add_trace(go.Bar(x=df[&#39; 구분 &#39;],y=df[&#39;  18세이상인구수(여)  &#39;],name = &quot;18세이상인구(여)&quot;),row=2,col=2)
fig.update_xaxes(tickangle=45, row=1, col=1)#tick angle = 눈금 각도, 글자의 각도를 수정할 수 있게 해준다
fig.update_xaxes(tickangle=45, row=1, col=2)
fig.update_xaxes(tickangle=45,row=2,col=1)
fig.update_xaxes(tickangle=45,row=2,col=2)
fig.update_layout(title_text=&quot;부산인구현황&quot;,)
fig.show()</code></pre>
<p><img src="attachment:8c041463-47c6-433c-b62c-df3c628dbf63:image.png" alt="image.png"></p>
<h2 id="scatter도-같이">scatter도 같이</h2>
<pre><code class="language-python">fig = go.Figure()

fig = make_subplots(rows=2,cols=2, subplot_titles=(&quot;인구수(남)&quot;,&quot;인구수(여)&quot;,&quot;18세이상인구수(남)&quot;,&quot;18세이상인구수(여)&quot;))
fig.add_trace(go.Bar(x=df[&#39; 구분 &#39;],y=df[&#39;  인구수(남)  &#39;],name = &quot;인구(남)&quot;),row=1,col=1)
fig.add_trace(go.Bar(x=df[&#39; 구분 &#39;],y=df[&#39;  인구수(여)  &#39;],name = &quot;인구(여)&quot;),row=1,col=2)
fig.add_trace(go.Scatter(x=df[&#39; 구분 &#39;],y=df[&#39;  18세이상인구수(남)  &#39;],name = &quot;18세이상인구(남)&quot;),row=2,col=1)
fig.add_trace(go.Scatter(x=df[&#39; 구분 &#39;],y=df[&#39;  18세이상인구수(여)  &#39;],name = &quot;18세이상인구(여)&quot;),row=2,col=2)
fig.update_xaxes(tickangle=45, row=1, col=1)#tick angle = 눈금 각도, 글자의 각도를 수정할 수 있게 해준다
fig.update_xaxes(tickangle=45, row=1, col=2)
fig.update_xaxes(tickangle=45,row=2,col=1)
fig.update_xaxes(tickangle=45,row=2,col=2)
fig.update_layout(title_text=&quot;부산인구현황&quot;,)
fig.show()</code></pre>
<p><img src="attachment:0690e67b-5007-4ae1-8a28-1e7a3c0290f4:image.png" alt="image.png"></p>
<h2 id="그래프-겹쳐서-출력">그래프 겹쳐서 출력</h2>
<pre><code class="language-python">fig = px.scatter(df, x = &#39; 구분 &#39;, y = &#39;  인구수(계)  &#39;)
fig.add_trace(go.Scatter(x=df[&#39; 구분 &#39;],y=df[&#39;  인구수(계)  &#39;],mode=&#39;lines+markers&#39;,name=&#39;인구수&#39;))
fig.add_trace(go.Scatter(x=df[&#39; 구분 &#39;],y=df[&#39;  65세이상인구수(계)  &#39;],mode=&#39;lines+markers&#39;,name=&#39;65세이상인구수&#39;))
fig.add_trace(go.Scatter(x=df[&#39; 구분 &#39;],y=df[&#39;  18세이상인구수(계)  &#39;],mode=&#39;lines+markers&#39;,name=&#39;18세이상인구수&#39;))
fig.update_xaxes(tickangle=0)
fig.update_layout(title = &quot;총인구수 및 18,65세이상인구수&quot;)
fig.show()</code></pre>
<p><img src="attachment:e4516ff6-52c3-4ce8-92b3-f04ae592874d:image.png" alt="image.png"></p>
<h2 id="그래프-크기-조절">그래프 크기 조절</h2>
<pre><code class="language-python">fig = make_subplots(rows=2,cols=2,  column_widths=[0.3, 0.7], row_heights =[0.7, 0.3], subplot_titles=(&quot;인구수(남)&quot;,&quot;인구수(여)&quot;,&quot;18세이상인구수(남)&quot;,&quot;18세이상인구수(여)&quot;))
fig.add_trace(go.Bar(x=df[&#39; 구분 &#39;],y=df[&#39;  인구수(남)  &#39;],name = &quot;인구(남)&quot;),row=1,col=1)
fig.add_trace(go.Bar(x=df[&#39; 구분 &#39;],y=df[&#39;  인구수(여)  &#39;],name = &quot;인구(여)&quot;),row=1,col=2)
fig.add_trace(go.Scatter(x=df[&#39; 구분 &#39;],y=df[&#39;  18세이상인구수(남)  &#39;],name = &quot;18세이상인구(남)&quot;),row=2,col=1)
fig.add_trace(go.Scatter(x=df[&#39; 구분 &#39;],y=df[&#39;  18세이상인구수(여)  &#39;],name = &quot;18세이상인구(여)&quot;),row=2,col=2)
fig.update_xaxes(tickangle=45, row=1, col=1)#tick angle = 눈금 각도, 글자의 각도를 수정할 수 있게 해준다
fig.update_xaxes(tickangle=45, row=1, col=2)
fig.update_xaxes(tickangle=45,row=2,col=1)
fig.update_xaxes(tickangle=45,row=2,col=2)
fig.update_layout(title_text=&quot;부산인구현황&quot;,)
fig.show()</code></pre>
<p><img src="attachment:af98d504-3f31-43f3-8f74-7c4885bd01a3:image.png" alt="image.png"></p>
<h2 id="세대수가-가장-많은-동에서-가장-적은-동-사이에-사각영역-추가">세대수가 가장 많은 동에서 가장 적은 동 사이에 사각영역 추가</h2>
<pre><code class="language-python">fig = px.scatter(df, x = &#39; 구분 &#39;, y = &#39;  세대수  &#39;)
fig.add_vrect(x0=1, x1=5, line_width=0, fillcolor=&quot;white&quot;, opacity=0.5,
              annotation_text=&quot;편차가 크다&quot;, 
              annotation_position=&quot;bottom right&quot;,
              annotation_font_size=10,
              annotation_font_color=&quot;black&quot;,
              annotation_font_family=&quot;Times New Roman&quot;)
fig.add_trace(go.Scatter(x=df[&#39; 구분 &#39;],y=df[&#39;  세대수  &#39;],name=&quot;세대수&quot;))
fig.update_layout(title = &quot;동별 세대수&quot;)
fig.update_xaxes(tickangle=0)
fig.show()</code></pre>
<p><img src="attachment:52ca9f1e-9301-4533-9c3b-ea4767bfbf1f:image.png" alt="image.png"></p>
<h2 id="table시각화">Table시각화</h2>
<pre><code class="language-python">fig = go.Figure()
fig.add_trace(
    go.Table(header=dict(values=[&quot;세대수&quot;,&quot;인구수&quot;,&quot;인구수(남)&quot;,&quot;인구수(여)&quot;]), #헤더
             cells=dict(values=[df[&#39;  세대수  &#39;], # 1열
                                df[&#39;  인구수(계)  &#39;],
                                df[&#39;  인구수(남)  &#39;],
                                df[&#39;  인구수(여)  &#39;]]))) # 2열
fig.update_layout(title =&quot;Table&quot;)
fig.show()</code></pre>
<p><img src="attachment:749c3e0d-93d2-42bd-9855-131add9b89a7:image.png" alt="image.png"></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-06-04]]></title>
            <link>https://velog.io/@smile_07/2025-06-04</link>
            <guid>https://velog.io/@smile_07/2025-06-04</guid>
            <pubDate>Wed, 04 Jun 2025 10:30:47 GMT</pubDate>
            <description><![CDATA[<h1 id="plotly-범례-지정하기-legend"><strong>Plotly 범례 지정하기 (Legend)</strong></h1>
<pre><code class="language-python">import plotly.express as px
#express 방식
#데이터 불러오기 
df = px.data.tips()

#데이터 확인
df.head()

#그래프 그리기
fig = px.scatter(df, x=&quot;total_bill&quot;, y=&quot;tip&quot;, color=&quot;sex&quot;)#x축은 total, y축은 tip, 찍히는건 성별로

fig.show()
</code></pre>
<pre><code class="language-python">
#graph_object 방식은 직접 성별 데이터를 구분하고 따로따로 구분하고 그래프를 그려줘야합니다

Female = df.loc[df[&quot;sex&quot;]==&quot;Female&quot;, :]
Female.head()

Male = df.loc[df[&quot;sex&quot;]==&quot;Male&quot;, :]
Male.head()

#그래프 그리기
import plotly.graph_objects as go

fig = go.Figure()

fig.add_trace(go.Scatter(
    x=Female.total_bill,#x값
    y=Female.tip,#y값
    mode=&#39;markers&#39;,#그래프 형식
    name=&quot;Female&quot;#이름
    #fig.add_trace() 를 통해 Trace를 추가할때 해당 데이터를 범례로 표시할 문구를name=안에 넣어줍니다.
))

fig.add_trace(go.Scatter(
    x=Male.total_bill,
    y=Male.tip,
    mode=&#39;markers&#39;,
    name=&quot;Male&quot;
))
</code></pre>
<h3 id="범례-삭제하기">범례 삭제하기</h3>
<pre><code class="language-python">fig.update_layout(showlegend=False)#update해서 비활성화 한다, 다시 보일려면 false에서true로 바꿔준다</code></pre>
<h3 id="범례-위치-지정">범례 위치 지정</h3>
<pre><code class="language-python">fig.update_layout(
            legend__x = (0~1) 사이값
            legend__y = (0~1) 사이값
            legend_xanchor = (`auto&quot;,&quot;left&quot;,&quot;center&quot;,&quot;right&quot;)#좌표를 중심으로한 왼쪽 또는 가운데 오른쪽
            legend_yanchor = (&quot;auto&quot;,&quot;top&quot;,&quot;middle&quot;,&quot;bottom&quot;)
            })
</code></pre>
<h1 id="plotly-수직선수평선사각영역-그리기"><strong>Plotly 수직선/수평선/사각영역 그리기</strong></h1>
<h3 id="수직수평선-그리기">수직/수평선 그리기</h3>
<pre><code class="language-python"># 수평선 그리기
fig.add_hline(y= 선의 y 위치,
            line_width= 선 두깨, 
            line_dash=선 스타일, 
            line_color=선 색,
            annotation_text= 주석 입력, 
            annotation_position= 주석 위치,
            annotation_font_size= 주석 폰트 사이즈,
            annotation_font_color=주석 폰트 색,
            annotation_font_family=주석 폰트 서체)

# 수직선 그리기
fig.add_vline(x= 선의 x 위치,
            line_width= 선 두깨, 
            line_dash=선 스타일, 
            line_color=선 색,
            annotation_text= 주석 입력, 
            annotation_position= 주석 위치,
            annotation_font_size= 주석 폰트 사이즈,
            annotation_font_color=주석 폰트 색,
            annotation_font_family=주석 폰트 서체)</code></pre>
<h3 id="둘다-그리기">둘다 그리기</h3>
<pre><code class="language-python">#데이터 불러오기
df = px.data.iris()

#그래프 그리기
fig = px.scatter(df, x=&quot;petal_length&quot;, y=&quot;petal_width&quot;)

# 수평선 추가하기
fig.add_hline(y=0.9,line_width=3, line_dash=&quot;dash&quot;,
              line_color=&quot;green&quot;,
              annotation_text=&quot;수평선&quot;, 
              annotation_position=&quot;bottom right&quot;,
              annotation_font_size=20,
              annotation_font_color=&quot;green&quot;,
              annotation_font_family=&quot;Times New Roman&quot;)

# 수직선 추가하기
fig.add_vline(x=3,line_width=3, line_dash=&quot;dash&quot;,
              line_color=&quot;red&quot;,
              annotation_text=&quot;수직선&quot;, 
              annotation_position=&quot;top left&quot;,
              annotation_font_size=20,
              annotation_font_color=&quot;red&quot;,
              annotation_font_family=&quot;Times New Roman&quot;)</code></pre>
<h3 id="사각-영역-그리기">사각 영역 그리기</h3>
<pre><code class="language-python"># 수평 사각영역 그리기
fig.add_vrect(x0= 영역시작 x좌표, x1=영역끝 x좌표, ,line_width= 테두리 선 두깨, line_dash=테두리 선 스타일, line_color=테두리 선 색, fillcolor=영역 색, opacity=영역 투명도)

# 수직영역 그리기
fig.add_hrect(x0= 영역시작 x좌표, x1=영역끝 x좌표, ,line_width= 테두리 선 두깨, line_dash=테두리 선 스타일, line_color=테두리 선 색, fillcolor=영역 색, opacity=영역 투명도)</code></pre>
<pre><code class="language-python">import plotly.express as px

#데이터 불러오기
df = px.data.iris()

#그래프 그리기
fig = px.scatter(df, x=&quot;petal_length&quot;, y=&quot;petal_width&quot;)

# 수직 사각 영 추가하기
fig.add_vrect(x0=3, x1=5, line_width=0, fillcolor=&quot;green&quot;, opacity=0.2,
#opacity= 불투명도, line_width 테두리 두께
              annotation_text=&quot;수직 영역&quot;, 
              annotation_position=&quot;bottom right&quot;,
              annotation_font_size=20,
              annotation_font_color=&quot;green&quot;,
              annotation_font_family=&quot;Times New Roman&quot;)

# 수평 사각 영역 추가하기
fig.add_hrect(y0=0.9, y1=1.5, line_width=0, fillcolor=&quot;red&quot;, opacity=0.2,
              annotation_text=&quot;수 영역&quot;, 
              annotation_position=&quot;top left&quot;,
              annotation_font_size=20,
              annotation_font_color=&quot;red&quot;,
              annotation_font_family=&quot;Times New Roman&quot;)

fig.show()
</code></pre>
<h1 id="plotly-다양한-도형-그리기"><strong>Plotly 다양한 도형 그리기</strong></h1>
<pre><code class="language-python">fig.add_shape(type=&quot;rect&quot;,
            x0= 왼쪽 아래 x좌표, y0= 왼쪽 아랫 y좌표,
            x1= 오늘쪽 위 x좌표, y1= 오른쪽 위 y좌표,
            line_width= 테두리선 두깨, 
            line_dash= 테두리선 스타일, 
            line_color= 테두리선 색,
            fillcolor= 안에 채우는 색,
            opacity = 투명도)</code></pre>
<h3 id="사각형">사각형</h3>
<pre><code class="language-python">import plotly.graph_objects as go

#그래프 생성
fig = go.Figure()

# 텍스트 추가
fig.add_trace(go.Scatter(
    x=[1.5, 4.5],
    y=[0.75, 0.75],
    text=[&quot;Unfilled Rectangle&quot;, &quot;Filled Rectangle&quot;],
    mode=&quot;text&quot;,
))

# 축 설정 변경
fig.update_xaxes(range=[0, 7], showgrid=False)
fig.update_yaxes(range=[0, 3.5])

# 사각형 그리기

fig.add_shape(type=&quot;rect&quot;,#사각형 타입
    x0=1, y0=1, x1=2, y1=3,
    line_color=&quot;RoyalBlue&quot;)

fig.add_shape(type=&quot;rect&quot;,
    x0=3, y0=1, x1=6, y1=2,
    line_color=&quot;RoyalBlue&quot;,
    line_width=2,#테두리 두계
    fillcolor=&quot;LightSkyBlue&quot;,
    opacity=0.5)

fig.show()</code></pre>
<h1 id="원-그리기">원 그리기</h1>
<pre><code class="language-python">fig.add_shape(type=&quot;circle&quot;,
            x0= 원점 x좌표, y0= 원 y좌표,
            x1= 가로 반지름, y1= 세로 반지름,
            line_width= 테두리선 두깨, 
            line_dash= 테두리선 스타일, 
            line_color= 테두리선 색,
            fillcolor= 안에 채우는 색,
            opacity = 투명도)</code></pre>
<pre><code class="language-python">import plotly.graph_objects as go

#그래프 생성
fig = go.Figure()

# 텍스트 추가
fig.add_trace(go.Scatter(
    x=[1.5, 3.5],
    y=[0.75, 2.5],
    text=[&quot;Unfilled Circle&quot;,
          &quot;Filled Circle&quot;],
    mode=&quot;text&quot;,
))

# 축 설정 변경
fig.update_xaxes(range=[0, 4.5], zeroline=False)
fig.update_yaxes(range=[0, 4.5])

# 원 그리기

fig.add_shape(type=&quot;circle&quot;,
    xref=&quot;x&quot;, yref=&quot;y&quot;,
    x0=1, y0=1, x1=3, y1=3,
    line_color=&quot;LightSeaGreen&quot;,)

fig.add_shape(type=&quot;circle&quot;,
    xref=&quot;x&quot;, yref=&quot;y&quot;,
    fillcolor=&quot;PaleTurquoise&quot;,
    x0=3, y0=3, x1=4, y1=4,
    line_color=&quot;LightSeaGreen&quot;,)

fig.show()</code></pre>
<h3 id="선-그리기">선 그리기</h3>
<pre><code class="language-python">fig.add_shape(type=&quot;line&quot;,
            x0= 선 시작 x좌표, y0= 선 시작 y좌표,
            x1= 선 끝 x좌표, y1= 선 끝 y좌표,
            line_width= 선 두깨, 
            line_dash= 선 스타일, 
            line_color= 선 색,
            opacity = 투명도)</code></pre>
<pre><code class="language-python">import plotly.graph_objects as go

#그래프 생성
fig = go.Figure()

# 텍스트 추가
fig.add_trace(go.Scatter(
    x=[2, 3.5, 6],
    y=[1, 1.5, 1],
    text=[&quot;Vertical Line&quot;,
          &quot;Horizontal Dashed Line&quot;,
          &quot;Diagonal dotted Line&quot;],mode=&quot;text&quot;,))

# 축 설정 변경
fig.update_xaxes(range=[0, 7])
fig.update_yaxes(range=[0, 2.5])

# 선 그리기

fig.add_shape(type=&quot;line&quot;,
    x0=1, y0=0, x1=1, y1=2,
    line_color=&quot;RoyalBlue&quot;,
    line_width=3)

fig.add_shape(type=&quot;line&quot;,
    x0=2, y0=2, x1=5, y1=2,
    line_color=&quot;LightSeaGreen&quot;,
    line_width=4,
    line_dash=&quot;dashdot&quot;)

fig.add_shape(type=&quot;line&quot;,
    x0=4, y0=0, x1=6, y1=2,
    line_color=&quot;MediumPurple&quot;,
    line_width=4,
    line_dash=&quot;dot&quot;)

fig.show()</code></pre>
<h3 id="다각형-그리기">다각형 그리기</h3>
<pre><code class="language-python">import plotly.graph_objects as go
# 그래프 생성
fig = go.Figure()

# 삼각형 그리기
fig.add_trace(go.Scatter(x=[5,6,7,5], y=[2,3,2,2], fill=&quot;toself&quot;))#채울꺼면 toself 아니면 fill을 안넣음

fig.show()</code></pre>
<pre><code class="language-python">import plotly.graph_objects as go

fig = go.Figure()

# 육각형
fig.add_trace(go.Scatter(x=[1,1,2,3,4,4,3,2,1], y=[1,2,3,3,2,1,0,0,1], fill=&quot;toself&quot;))

# 사각형
fig.add_trace(go.Scatter(x=[5,5,7,7,5], y=[0.5,1.5,1.5,0.5,0.5], fill=&quot;toself&quot;))

# 삼각형
fig.add_trace(go.Scatter(x=[5,6,7,5], y=[2,3,2,2], fill=&quot;toself&quot;))

fig.show()</code></pre>
<h1 id="plotly-텍스트주석-넣기"><strong>Plotly 텍스트/주석 넣기</strong></h1>
<h3 id="annotation-넣기"><strong>Annotation 넣기</strong></h3>
<pre><code class="language-python">fig.add_annotation(
            x= x 좌표, y= y 좌표,
            text= 주석 텍스트,
            textangle= 텍스트 각도,
            font_color = 텍스트 색,
            font_family = 텍스트 서체,
            font_size = 텍스트 사이즈,
            arrowhead = 화살표 스타일,
            arrowcolor= 화살표 색,
            arrowside= 화살표 방향,
            arrowsize= 화살표 크기,
            arrowwidth = 화살표 두깨,
            bgcolor=텍스트 백그라운드색,
            bordercolor= 테두리 색,
            borderwidth = 테두리 두깨,
            opacity = 투명도,
            xshift = x축 방향 평행이동,
            yshift = y축 방향 평행이동)</code></pre>
<pre><code class="language-python">import plotly.graph_objects as go

#그래프 생성
fig = go.Figure()

fig.add_trace(go.Scatter(
    x=[0, 1, 2, 3, 4, 5, 6, 7, 8],
    y=[0, 1, 3, 2, 4, 3, 4, 6, 5]
))

fig.add_trace(go.Scatter(
    x=[0, 1, 2, 3, 4, 5, 6, 7, 8],
    y=[0, 4, 5, 1, 2, 2, 3, 4, 2]
))

# annotation 추가
fig.add_annotation(x=2, y=5,
            text=&quot;Text annotation with arrow&quot;,
            showarrow=True,
            arrowhead=1)
fig.add_annotation(x=4, y=4,
            text=&quot;Text annotation without arrow&quot;,
            showarrow=False,
            yshift=10)

fig.show()</code></pre>
<h3 id="텍스트-넣기">텍스트 넣기</h3>
<pre><code class="language-python">go.Scatter(x=[X좌표 리스트], y=[Y좌표 리스트],text=[텍스트 리스트] mode=&quot;text&quot;, textposition= 텍스트 위치)</code></pre>
<pre><code class="language-python">import plotly.graph_objects as go

fig = go.Figure()

fig.add_trace(go.Scatter(
    x=[0, 1, 2],
    y=[1, 1, 1],
    mode=&quot;text&quot;,
    name=&quot;아랫줄&quot;,
    text=[&quot;Text A&quot;, &quot;Text B&quot;, &quot;Text C&quot;],
    textposition=&quot;top center&quot;))

fig.add_trace(go.Scatter(
    x=[0, 1, 2],
    y=[2, 2, 2],
    mode=&quot;text&quot;,
    name=&quot;중간줄&quot;,
    text=[&quot;Text D&quot;, &quot;Text E&quot;, &quot;Text F&quot;],
    textposition=&quot;bottom center&quot;))

fig.add_trace(go.Scatter(
    x=[0, 1, 2],
    y=[3, 3, 3],
    mode=&quot;text&quot;,
    name=&quot;윗줄&quot;,
    text=[&quot;Text G&quot;, &quot;Text H&quot;, &quot;Text I&quot;],
    textposition=&quot;bottom center&quot;))

fig.show()</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-06-02]]></title>
            <link>https://velog.io/@smile_07/2025-06-02</link>
            <guid>https://velog.io/@smile_07/2025-06-02</guid>
            <pubDate>Mon, 02 Jun 2025 10:40:24 GMT</pubDate>
            <description><![CDATA[<h1 id="plotly-tick눈금-tick-레이블-표시-설정하기">Plotly tick(눈금)<strong>/ tick 레이블 표시 설정하기</strong></h1>
<h3 id="눈금생성하기">눈금생성하기</h3>
<pre><code class="language-python">import plotly.express as px
#데이터 불러오기
df = px.data.iris()

# Figure 생성
fig = px.scatter(df, x=&quot;sepal_width&quot;, y=&quot;sepal_length&quot;, facet_col=&quot;species&quot;)

# 눈금 생성
fig.update_xaxes(ticks=&quot;outside&quot;)#눈금이 x좌료의 바깥쪽에 생선된다
fig.update_yaxes(ticks=&quot;inside&quot;)#눈금이 y좌료의 안쪽에 생성된다

fig.show()</code></pre>
<h3 id="열만-지정하여-눈금생성">열만 지정하여 눈금생성</h3>
<pre><code class="language-python">import plotly.express as px
#데이터 불러오기
df = px.data.iris()
# Figure 생성
fig = px.scatter(df, x=&quot;sepal_width&quot;, y=&quot;sepal_length&quot;, facet_col=&quot;species&quot;)
#facet_col-:&quot;species&quot; 는 종으로 나뉘기 때문에 3개가 생성됩니다
# 눈금 생성
fig.update_xaxes(ticks=&quot;outside&quot;)
fig.update_yaxes(ticks=&quot;inside&quot;, col=1)#y좌표의 생선된것중 col1만 눈금을 생성합니다

fig.show()</code></pre>
<h3 id="tick-간격지정">tick 간격지정</h3>
<pre><code class="language-python">fig.update_xaxes(dtick=간격 입력)
fig.update_yaxes(dtick=간격 입력)#원하는 만큼 간격을 조절할 수 있습니다</code></pre>
<h3 id="tick-위치-수동-입력">tick 위치 수동 입력</h3>
<pre><code class="language-python">fig.update_xaxes(tickvals=[tick 좌료 리스트])
fig.update_yaxes(tickvals=[tick 좌료 리스트])#자동생성이 아닌 생성된 위치 값을 입력하여 제한한다
#예제
fig.update_yaxes(tickvals=[5.1, 5.9, 6.3, 7.5])# 이러면 y축의 5.1, 5.9, 6.3, 7.5에 눈금이 생성된다
</code></pre>
<h3 id="tick-스타일-설정">tick 스타일 설정</h3>
<pre><code class="language-python">fig.update_xaxes(tickwidth=두꺠, tickcolor=색, ticklen=길이)
fig.update_yaxes(tickwidth=두꺠, tickcolor=색, ticklen=길이)#눈금의 두께, 색, 길이를 조절할 수 있다</code></pre>
<h3 id="tick-레이블-위치-설정"><strong>tick 레이블 위치 설정</strong></h3>
<pre><code class="language-python">fig.update_yaxes(ticklabelposition=&quot;위치&quot;)
fig.update_xaxes(ticklabelposition=&quot;위치&quot;)#레이블의 위치를 바꿀수 있다

#위치 {&quot;outside&quot; | &quot;inside&quot; | &quot;outside top&quot; | &quot;inside top&quot; | &quot;outside left&quot; | &quot;inside left&quot; | &quot;outside right&quot; | &quot;inside right&quot; | &quot;outside bottom&quot; | &quot;inside bottom&quot;}
</code></pre>
<h3 id="tick-레이블-삭제">tick 레이블 삭제</h3>
<pre><code class="language-python">fig.update_xaxes(showticklabels=False)#레이블을 비활성화 삭제 시켜준다
fig.update_yaxes(showticklabels=False)</code></pre>
<h1 id="plotly-축-스타일-편집하기"><strong>Plotly 축 스타일 편집하기</strong></h1>
<pre><code class="language-python">import plotly.express as px
#데이터 불러오기
df = px.data.tips()

# Figure 생성
fig = px.histogram(df, x=&quot;sex&quot;, y=&quot;tip&quot;, histfunc=&#39;sum&#39;, facet_col=&#39;smoker&#39;)
#담배 피는 사람과 안피는 사람 두 종류로 분류한다
# 축 스타일 편집
fig.update_xaxes(showline=True, linewidth=3, linecolor=&#39;black&#39;)#라인을 보여주나=ture, 라인 두깨=3, 라인 색 = black
fig.update_yaxes(showline=True, linewidth=3, linecolor=&#39;red&#39;)
#이것도 뒤에 , col을 붙여주면 원하는 것만 지정해서 레이블을 달아 줄 수 있다

fig.show()</code></pre>
<h3 id="축-반대편-라인-편집"><strong>축 반대편 라인 편집</strong></h3>
<pre><code class="language-python">fig.update_xaxes(mirror=True)
fig.update_yaxes(mirror=True)#거울 보듯이 똑같이 라인의 스타일을 맞추냐 True False</code></pre>
<h1 id="plotly-그리드-설정하기"><strong>Plotly 그리드 설정하기</strong></h1>
<p>그리드는 총 2종류가 있습니다. 큰 단위로 나뉘주는 그리드와 더 작은 단위로 촘촘하게 나뉘주는 minor gird가 있습니다. 기본 그리드는 설정을 따로 하지 않아도 시각화 시 자동으로 보여집니다. minor grid는 따로 코드를 추가해야만 추가가 됩니다.</p>
<h3 id="그리드-설정">그리드 설정</h3>
<pre><code class="language-python">import plotly.express as px
#데이터 불러오기
df = px.data.iris()

# Figure 생성
fig = px.scatter(df, x=&quot;sepal_width&quot;, y=&quot;sepal_length&quot;, facet_col=&quot;species&quot;)

# 그리드/ minor 그리드 시각화
fig.update_xaxes(showgrid=True, minor_showgrid=True)
fig.update_yaxes(showgrid=True, minor_showgrid=True)
#그리드 또한 ,col을 사용하여 원하는 곳에만 지정할 수 있습니다
fig.show()</code></pre>
<h3 id="그리드-스타일-편집">그리드 스타일 편집</h3>
<pre><code class="language-python"># 그리드 스타일 편집
fig.update_xaxes(gridwidth= 두깨, gridcolor= 색,griddash = 그리드 모양)
fig.update_yaxes(gridwidth= 두깨, gridcolor= 색,griddash = 그리드 모양)

# minor 그리드 스타일 편집
fig.update_xaxes(minor_gridwidth= 두깨, minor_gridcolor= 색,minor_griddash = 그리드 모양)
fig.update_yaxes(minor_gridwidth= 두깨, minor_gridcolor= 색,minor_griddash = 그리드 모양)</code></pre>
<h1 id="plotly-여러개의-그래프-겹쳐-그리기"><strong>Plotly 여러개의 그래프 겹쳐 그리기</strong></h1>
<p>1.Base 그래프 그리기’</p>
<pre><code class="language-python">import plotly.graph_objects as go

# Base Figure 생성
fig = go.Figure()

fig.show()</code></pre>
<p>2.추가 할 그래프 그리기</p>
<pre><code class="language-python">import plotly.graph_objects as go

#데이터 생성
import numpy as np
np.random.seed(1)4

N = 100
random_x = np.linspace(0, 1, N)#0~1까지 N값을 랜덤으로 뽑는다
random_y0 = np.random.randn(N) + 5#n값 +5
random_y1 = np.random.randn(N)
random_y2 = np.random.randn(N) - 5#n값 -5 하는 이유는 그래프들이 겹치지 않기 위해서
# Base Figure 생성
fig = go.Figure()

# 추가 할 그래프 그리기
fig.add_trace(go.Scatter(x=random_x, y=random_y0,
                    mode=&#39;lines&#39;,
                    name=&#39;lines&#39;))
fig.add_trace(go.Scatter(x=random_x, y=random_y1,
                    mode=&#39;lines+markers&#39;,
                    name=&#39;lines+markers&#39;))
fig.add_trace(go.Scatter(x=random_x, y=random_y2,
                    mode=&#39;markers&#39;, 
                    name=&#39;markers&#39;))

fig.show()</code></pre>
<h1 id="plotly-여러개의-그래프-나눠-그리기"><strong>Plotly 여러개의 그래프 나눠 그리기</strong></h1>
<pre><code class="language-python">from plotly.subplots import make_subplots
import plotly.graph_objects as go

# 나눠서 그릴 공간 생성
fig = make_subplots(rows=1, cols=2)

# 각 공간에 Trace 채워넣
fig.add_trace(
    go.Scatter(x=[1, 2, 3], y=[4, 5, 6]),
    row=1, col=1
)
fig.add_trace(
    go.Scatter(x=[20, 30, 40], y=[50, 60, 70]),
    row=1, col=2
)
fig.show()
</code></pre>
<h3 id="서브-제목-달기">서브 제목 달기</h3>
<pre><code class="language-python">subplot_titles=(&quot;Plot 1&quot;, &quot;Plot 2&quot;, &quot;Plot 3&quot;, &quot;Plot 4&quot;))
#자동으로 이름을 달아준다</code></pre>
<h3 id="각-공간별-크기-비율-지정하기"><strong>각 공간별 크기 비율 지정하기</strong></h3>
<pre><code class="language-python">column_widths=[0.7, 0.3], row_heights =[0.7, 0.3])#각 trace가 위치할 크기 비율
</code></pre>
<h3 id="공간-별-축-공유하기">공간 별 축 공유하기</h3>
<pre><code class="language-python">shared_xaxes=(True or False), shared_yaxes=(True or False))
</code></pre>
<h3 id="분할-공간-병합">분할 공간 병합</h3>
<pre><code class="language-python">    specs=[[{}, {}],
           [{&quot;colspan&quot;: 2}, None]],#여기 공간은 총 2행2열 이므로 2행 1열과 2헹 2열을 병합 함으로 colspan:2를 쓰고 2행2열 자리에는 None을 입력해준다
</code></pre>
<h1 id="plotly-이중-y축-표시하기"><strong>Plotly 이중 Y축 표시하기</strong></h1>
<pre><code class="language-python">import plotly.graph_objects as go
from plotly.subplots import make_subplots

# Create figure with secondary y-axis
fig = make_subplots(specs=[[{&quot;secondary_y&quot;: True}]])#secondary = True로 이중축이 활성화 되고 오른쪽에 축이 생성됨

# 표 추가
fig.add_trace(
    go.Scatter(x=[1, 2, 3], y=[40, 50, 60], name=&quot;yaxis data&quot;),
    secondary_y=False,
)
#표 추가
fig.add_trace(
    go.Scatter(x=[2, 3, 4], y=[4, 5, 6], name=&quot;yaxis2 data&quot;),
    secondary_y=True,
)

# 타이틀 추가 
fig.update_layout(
    title_text=&quot;Double Y Axis Example&quot;
)

# X축 이름
fig.update_xaxes(title_text=&quot;xaxis title&quot;)

# Y축 이름
fig.update_yaxes(title_text=&quot;&lt;b&gt;primary&lt;/b&gt; yaxis title&quot;, secondary_y=False)
fig.update_yaxes(title_text=&quot;&lt;b&gt;secondary&lt;/b&gt; yaxis title&quot;, secondary_y=True)

fig.show()</code></pre>
<h3 id="여러개-그래프-이중-y축-설정하기">여러개 그래프 이중 Y축 설정하기</h3>
<pre><code class="language-python">import plotly.graph_objects as go
from plotly.subplots import make_subplots

# Create figure with secondary y-axis
fig = make_subplots(rows=2, cols=2,
                    specs=[[{&quot;secondary_y&quot;: True}, {&quot;secondary_y&quot;: True}],
                           [{&quot;secondary_y&quot;: True}, {&quot;secondary_y&quot;: True}]])
#4개의 그래프 모두 이중축을 허용한다
# Top left
fig.add_trace(
    go.Scatter(x=[1, 2, 3], y=[2, 52, 62], name=&quot;yaxis data&quot;),
    row=1, col=1, secondary_y=False)

fig.add_trace(
    go.Scatter(x=[1, 2, 3], y=[40, 50, 60], name=&quot;yaxis2 data&quot;),
    row=1, col=1, secondary_y=True,
)

# Top right
fig.add_trace(
    go.Scatter(x=[1, 2, 3], y=[2, 52, 62], name=&quot;yaxis3 data&quot;),
    row=1, col=2, secondary_y=False,
)

fig.add_trace(
    go.Scatter(x=[1, 2, 3], y=[40, 50, 60], name=&quot;yaxis4 data&quot;),
    row=1, col=2, secondary_y=True,
)

# Bottom left
fig.add_trace(
    go.Scatter(x=[1, 2, 3], y=[2, 52, 62], name=&quot;yaxis5 data&quot;),
    row=2, col=1, secondary_y=False,
)

fig.add_trace(
    go.Scatter(x=[1, 2, 3], y=[40, 50, 60], name=&quot;yaxis6 data&quot;),
    row=2, col=1, secondary_y=True,
)

# Bottom right
fig.add_trace(
    go.Scatter(x=[1, 2, 3], y=[2, 52, 62], name=&quot;yaxis7 data&quot;),
    row=2, col=2, secondary_y=False,
)

fig.add_trace(
    go.Scatter(x=[1, 2, 3], y=[40, 50, 60], name=&quot;yaxis8 data&quot;),
    row=2, col=2, secondary_y=True,
)

fig.show()</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-05-29]]></title>
            <link>https://velog.io/@smile_07/2025-05-29</link>
            <guid>https://velog.io/@smile_07/2025-05-29</guid>
            <pubDate>Thu, 29 May 2025 10:56:23 GMT</pubDate>
            <description><![CDATA[<h1 id="plotly-타이틀-설정하기">Plotly 타이틀 설정하기</h1>
<pre><code class="language-python">fig.update_layout(title_text=&quot;타이틀 입력&quot;)
#이것은 기존에 있는 fig라는 그래프에 타이틀을
#업데이트 한것으로 이걸로 express,graph 두가지 방식 모두 커버 가능하다</code></pre>
<h3 id="위치-지정">위치 지정</h3>
<pre><code class="language-python">fig.update_layout(
            title_x = (0~1) 사이값#x좌표
            title_y = (0~1) 사이값#y좌표
            title_xanchor = (`auto&quot;,&quot;left&quot;,&quot;center&quot;,&quot;right&quot;)#좌표를 중심으로 타이틀을 왼쪽, 또는 가운데, 오른쪽에 놓을지 설정합니다.
            title_yanchor = (&quot;auto&quot;,&quot;top&quot;,&quot;middle&quot;,&quot;bottom&quot;)#title_yanchor = 좌표를 중심으
            })</code></pre>
<h2 id="plotly-축-타이틀-설정하기axes-title"><strong>Plotly 축 타이틀 설정하기(Axes Title)</strong></h2>
<h3 id="graph_object--그래프">graph_object  그래프</h3>
<pre><code class="language-python">fig.update_xaxes(title_text=&#39;X축 타이틀명&#39;)#x축에 삽입할 타이틀명을 업데이트 한다
fig.update_yaxes(title_text=&#39;Y축 타이틀명&#39;)#축만 바뀌지 위와 같다ㅣ</code></pre>
<h3 id="축-타이틀-스타일-설정방법">축 타이틀 스타일 설정방법</h3>
<pre><code class="language-python">
fig.update_xaxes(title_font_size =30,
                 title_font_color=&#39;crimson&#39;,
                 title_font_family=&#39;Courier&#39;)
fig.update_yaxes(title_font_size =30,
                 title_font_color=&#39;crimson&#39;,
                 title_font_family=&#39;Courier&#39;)</code></pre>
<p>축의 타이틀도 글자크기, 색, 폰트변경이 똑같이 가능하다</p>
<h3 id="축-타이틀-위치-지정방법">축 타이틀 위치 지정방법</h3>
<pre><code class="language-python">fig.update_xaxes(title_standoff= 100)#x축 타이틀의 위치간격을 업데이트할 수 있다
fig.update_yaxes(title_standoff= 100)#
fig.update_xaxes(title=None)#축에 있는 레이블삭제
fig.update_yaxes(title=None)</code></pre>
<h2 id="plotly-축-범위-지정하기"><strong>Plotly 축 범위 지정하기</strong></h2>
<pre><code class="language-python">fig.update_xaxes(range=[min, max])#최소값 최대값으로 축 범위 지정
fig.update_yaxes(range=[min, max])</code></pre>
<h3 id="축-범위-역방향으로-지정하기">축 범위 역방향으로 지정하기</h3>
<pre><code class="language-python">fig.update_xaxes(autorange=&quot;reversed&quot;)#x좌표 레이어 역방향으로 반전시키기
fig.update_yaxes(autorange=&quot;reversed&quot;)</code></pre>
<h3 id="log-스케일-지정하기">Log 스케일 지정하기,</h3>
<pre><code class="language-python"># 축 Log 스케일로 변환
fig.update_xaxes(type=&quot;log&quot;)
fig.update_yaxes(type=&quot;log&quot;)</code></pre>
<pre><code class="language-python">facet_col=&quot;species&quot;#facet_col 열로 나눠준다( species = 종),열 방향으로 종을 기준으로 나눠준다</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-05-28]]></title>
            <link>https://velog.io/@smile_07/2025-05-28</link>
            <guid>https://velog.io/@smile_07/2025-05-28</guid>
            <pubDate>Wed, 28 May 2025 11:07:42 GMT</pubDate>
            <description><![CDATA[<h1 id="plotly-기초-그래프-생성하기">Plotly 기초 그래프 생성하기</h1>
<h3 id="기본설정">기본설정</h3>
<pre><code class="language-python">import plotly.graph_objects as go</code></pre>
<h2 id="막대-그래프-시각화">막대 그래프 시각화</h2>
<pre><code class="language-python">#graph_objects
fig = go.Figure(
    data=[go.Bar(x=[1,2,3], y=[1,3,2])],#x는 가로 bar의 수 y= 높이 이다
    layout=go.Layout(
        title=go.layout.Title(text=&quot;A Figure Specified By&quot;))#타이틀, 제목생성
)
fig.show()

#express
fig = px.bar(x=[&quot;a&quot;,&quot;b&quot;,&quot;c&quot;], y=[1,3,2],title=&quot;A Figure Specified By express&quot;)
#여기는 데이터와 layout을 나누지 않고 px.bar로 묶어서 실행한다
fig.show()</code></pre>
<p><img src="attachment:f789090f-3ba0-4c9d-a4fd-4b449af16a43:image.png" alt="image.png"></p>
<h2 id="add_trace">add_trace()</h2>
<pre><code class="language-python">fig = go.Figure()
fig.add_trace(go.Bar(x=[1,2,3,], y=[1,3,2]))
fig.show()
#위 막대그래프와 똑같이 출력</code></pre>
<p>scatter 그래프 생성</p>
<pre><code class="language-python">df = px.data.iris()
fig = px.scatter(df, x= &quot;sepal_width&quot;, y=&quot;sepal_length&quot;, color=&quot;species&quot;, title=&quot;Using The add_trace() method With A Plotly Express Figure&quot;)
fig.add_trace(
    go.Scatter(
        x=[2,4],
        y=[4,8],
        mode = &quot;lines&quot;,
        line = go.scatter.Line(color=&quot;gray&quot;),
        showlegend=False)
)
fig.show()</code></pre>
<p><img src="attachment:f83b3194-6e6e-4e8b-8a20-1bafa0a54eb7:image.png" alt="image.png"></p>
<h2 id="update_trace">update_trace()</h2>
<pre><code class="language-python"># subplot 생성
fig = make_subplots(rows=1, cols=2)

# Trace 추가하기
fig.add_scatter(y=[4, 2, 3.5], mode=&quot;markers&quot;,
                marker=dict(size=20, color=&quot;LightSeaGreen&quot;),
                name=&quot;a&quot;, row=1, col=1)
fig.add_bar(y=[2, 1, 3],
            marker=dict(color=&quot;MediumPurple&quot;),
            name=&quot;b&quot;, row=1, col=1)
fig.add_scatter(y=[2, 3.5, 4], mode=&quot;markers&quot;,
                marker=dict(size=20, color=&quot;MediumPurple&quot;),
                name=&quot;c&quot;, row=1, col=2)
fig.add_bar(y=[1, 3, 2],
            marker=dict(color=&quot;LightSeaGreen&quot;),
            name=&quot;d&quot;, row=1, col=2)
fig.update_traces(marker=dict(color=&quot;RoyalBlue&quot;),
                  selector=dict(type=&quot;bar&quot;))

fig.show()</code></pre>
<p><img src="attachment:f1ca0687-4303-487c-baaf-beb9496b89d9:image.png" alt="image.png"></p>
<h2 id="update_layout"><strong>update_layout()</strong></h2>
<p>update_layout() 함수를 사용하면 그래프 사이즈, 제목 및 텍스트, 글꼴크기 와 같은 Trace 외적인 그래프 요소를 업데이트 가능합니다.</p>
<pre><code class="language-python">
#그래프 생성
fig = go.Figure(data=go.Bar(x=[1, 2, 3], y=[1, 3, 2]))

# 타이틀 추가하기
fig.update_layout(title_text=&quot;Using update_layout() With Graph Object Figures&quot;,title_font_size=30)

fig.show()</code></pre>
<h2 id="update_xaxes--update_yaxes"><strong>update_xaxes() / update_yaxes()</strong></h2>
<p>update_xaxes(), update_yaxes() 함수를 사용하면 각각 X축, Y축에 관한 다양한 편집이 가능합니다. ex) 축 타이틀, 축 라인 스타일, 그리드 설정 등</p>
<pre><code class="language-python">#데이터 생성
df = px.data.tips()
x = df[&quot;total_bill&quot;]
y = df[&quot;tip&quot;]
# 그래프 그리기
fig = go.Figure(data=go.Scatter(x=x, y=y, mode=&#39;markers&#39;))
# 축 타이틀 추가하기
fig.update_xaxes(title_text=&#39;Total Bill ($)&#39;)
fig.update_yaxes(title_text=&#39;Tip ($)&#39;)
fig.show()</code></pre>
<h1 id="ploty-그래프-사이즈-설정하기"><strong>Ploty 그래프 사이즈 설정하기</strong></h1>
<h3 id="express-그래프">express 그래프</h3>
<pre><code class="language-python">fig = px.bar(x=[&quot;a&quot;, &quot;b&quot;, &quot;c&quot;], y=[1, 3, 2],width=600, height=400)#width와 height는 그래프의 가로 세로의 크기를 정의 한다
fig.show()</code></pre>
<h3 id="graph-object-그래프">graph object 그래프</h3>
<pre><code class="language-python">fig = go.Figure(data=[go.Bar(x=[1, 2, 3], y=[1, 3, 2])])
fig.update_layout(width=600,height=400)
fig.show()</code></pre>
<h2 id="margine"><strong>Margine</strong></h2>
<p>margin 이란 전체 크기(Figure) 와 그래프(Trace) 사이의 거리를 뜻합니다.</p>
<pre><code class="language-python">fig.update_layout(
        margin_l=left margine,#왼쪽
        margin_r=right margine,#오른쪽
        margin_b=bottom margine,#아래
        margin_t=top margine)#위</code></pre>
<pre><code class="language-python">fig = px.bar(x=[&quot;a&quot;, &quot;b&quot;, &quot;c&quot;], y=[1, 3, 2])

# 그래프 크기와 margin 설정하기
fig.update_layout(
    width=600,
    height=400,
    margin_l=100,
    margin_r=100,
    margin_b=70,
    margin_t=70,
    # 백그라운드 칼라 지정, margin 잘 보이게 하기위함
    paper_bgcolor=&quot;LightSteelBlue&quot;,
)

fig.show()</code></pre>
<p><img src="attachment:82660688-3c77-4ff7-8470-b6935406d8a5:image.png" alt="image.png"></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-05-20]]></title>
            <link>https://velog.io/@smile_07/2025-05-20</link>
            <guid>https://velog.io/@smile_07/2025-05-20</guid>
            <pubDate>Tue, 20 May 2025 11:12:25 GMT</pubDate>
            <description><![CDATA[<h1 id="plotting기초-plot"><strong>plotting기초 (plot)</strong></h1>
<p>dataframe 객체를 시각화 하는 메서드</p>
<p><code>kind</code> : 플로팅할 유형입니다. 목록은 아래와 같습니다.</p>
<p>※ {line / bar / barh / hist / box / kde / density / area / pie / scatter / hexbin} <code>x / y</code> : 각 축으로 설정할 값(컬럼명) 입니다.</p>
<p><code>ax</code> : 현재 figure의 axes 입니다. (fig와 axes의 개념은 아래 링크 참고)</p>
<p>※ <a href="https://matplotlib.org/stable/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-py">링크</a></p>
<p><code>subplot</code> : 각 열들을 별개의 서브차트로 플로팅할지의 여부입니다.</p>
<p><code>sharex / sharey</code> : subplot=True 인 경우 각축의 눈금을 공유할지 여부 입니다.</p>
<p><code>layout</code> : 튜플로 입력하는 subplot의 배열입니다.</p>
<p><code>figsize</code> : 출력할 fig의 크기 입니다.</p>
<p><code>use_index</code> : 인덱스를 x축의 눈금으로 사용할지 여부 입니다.</p>
<p><code>title</code> : fig의 제목 입니다.</p>
<p><code>grid</code> : 배경 격자의 형성 여부입니다.</p>
<p><code>legend</code> : subplot에서의 범례 배치 입니다.</p>
<p><code>style</code> : 선의 스타일 입니다. 자세한것은 <a href="https://matplotlib.org/stable/gallery/lines_bars_and_markers/linestyles.html">링크</a> 참고 바랍니다.</p>
<p><code>logx / logy / loglog</code> : 각 축에 대해 로그 스케일을 적용할지 여부 입니다. <code>loglog=True</code>인 경우 두 축에 모두 적용합니다.</p>
<p><code>xticks / yticks</code> : 각 축의 눈금 값을 지정합니다.</p>
<p><code>xlim / ylim</code> : 각 축의 값의 경계를 지정합니다.</p>
<p><code>xlabel / ylabel</code> : 각 축의 라벨을 지정합니다.</p>
<p><code>rot</code> : 눈금값의 기울기 입니다. 눈금값이 많을경우 유용합니다.</p>
<p><code>fontsize</code> : 눈금값의 크기 입니다.</p>
<p><code>colormap / colorbar</code> : 각 값에 대해 <a href="https://matplotlib.org/stable/tutorials/colors/colormaps.html">matplolib 에서 지원하는 colormap</a>을 적용할 수 있습니다.</p>
<p><code>table</code> : True면 데이터를 테이블로 출력하며 matplotlib의 기본 레이아웃에 맞게 전치됩니다.</p>
<p><code>yerr / xerr</code> : 특정 열의 값을 이용하여 오차범위 표현을 할 수 있습니다.</p>
<p><code>stacked</code> : bar plot이나 barh plot의 경우 막대 그래프를 누적 막대그래프로 표현할 수 있습니다.</p>
<p><code>sort_columns</code> : 열을 정렬하여 플랏할지 여부입니다.</p>
<p><code>secondary_y</code> : 보조축 레이블을 출력할지 여부 입니다.</p>
<p><code>mark_right</code> : 보조축 레이블을 출력할 경우 범례에 &quot;(right)&quot;으로 열 레이블을 표시할지 여부 입니다.</p>
<p><code>include_bool</code> : bool형식의 값을 플랏할지 여부입니다.</p>
<p><code>backend</code> : plotting.backend 옵션에 지정된 백엔드 대신 사용할 백엔드. 예를 들어, &#39;matplotlib&#39;. 또는 전체 세션에 대해 plotting.backend를 지정하려면 pd.options.plotting.backend를 설정할 수 있습니다.</p>
<pre><code class="language-python">val = np.linspace(0,100,101)
sin = np.sin(np.pi/25*val)
tan = np.tan(np.pi/25*val)
df = pd.DataFrame(data={&#39;val&#39;:val,&#39;sin&#39;:sin,&#39;tan&#39;:tan})
print(df)
&gt;&gt;
       val           sin           tan
0      0.0  0.000000e+00  0.000000e+00
1      1.0  1.253332e-01  1.263294e-01
2      2.0  2.486899e-01  2.567564e-01
3      3.0  3.681246e-01  3.959280e-01
4      4.0  4.817537e-01  5.497547e-01
..     ...           ...           ...
96    96.0 -4.817537e-01 -5.497547e-01
97    97.0 -3.681246e-01 -3.959280e-01
98    98.0 -2.486899e-01 -2.567564e-01
99    99.0 -1.253332e-01 -1.263294e-01
100  100.0  1.286498e-15  1.286498e-15</code></pre>
<p><code>df2</code>는 <code>df</code>에서 sin, tan값만 추려낸 데이터 입니다.</p>
<p>sin과 tan은 삼각함수로, 각도에 따라 변하는 값을 나타냅니다.</p>
<p><strong>sin은 수직 변의 길이를, tan은 수직 변과 수평 변의 비율을 나타냅니다</strong></p>
<p><strong>sin(사인):</strong></p>
<ul>
<li>직각삼각형에서, 한 각에 대한 수직 변(높이)의 길이를 빗변의 길이로 나눈 값입니다.</li>
<li>수직 방향으로 얼마나 떨어져 있는지 나타냅니다.</li>
</ul>
<p><strong>tan(탄젠트):</strong></p>
<ul>
<li>직각삼각형에서, 한 각에 대한 수직 변(높이)의 길이를 수평 변(밑변)의 길이로 나눈 값입니다.</li>
</ul>
<p>수직 변과 수평 변의 비율을 나타냅니다.</p>
<ul>
<li>수직 변과 수평 변의 비율을 나타냅니다.</li>
</ul>
<p>sin 값을 cos 값으로 나눈 것과 같습니다.</p>
<ul>
<li>sin 값을 cos 값으로 나눈 것과 같습니다.</li>
</ul>
<pre><code class="language-python">df2 = df.loc[:,[&#39;sin&#39;,&#39;tan&#39;]]
print(df2)
&gt;&gt;
              sin           tan
0    0.000000e+00  0.000000e+00
1    1.253332e-01  1.263294e-01
2    2.486899e-01  2.567564e-01
3    3.681246e-01  3.959280e-01
4    4.817537e-01  5.497547e-01
..            ...           ...
96  -4.817537e-01 -5.497547e-01
97  -3.681246e-01 -3.959280e-01
98  -2.486899e-01 -2.567564e-01
99  -1.253332e-01 -1.263294e-01
100  1.286498e-15  1.286498e-15

[101 rows x 2 columns]</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p>기본 적인 사용법은 df.plot() 형태 입니다. line 형태로 모든 열을 plot하게 됩니다.</p>
<pre><code class="language-python">df2.plot()
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_1.png" alt=""></p>
<p>sin그래프, tan그래프가 출력된 것을 확인할 수 있습니다.</p>
<p><strong>kind, x, y 인수의 사용</strong></p>
<p><code>kind</code>인수를 통해 원하는 형태의 그래프를 출력 할 수 있으며, <code>x와 y</code>로 해당 그래프의 x와 y를 지정할 수 있습니다.</p>
<p>※ {line / bar / barh / hist / box / kde / density / area / pie / scatter / hexbin}</p>
<pre><code class="language-python">df.plot(kind=&#39;line&#39;, x=&#39;val&#39;, y=&#39;sin&#39;)
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_2.png" alt=""></p>
<p>x축의 값은 0~100, y축의 값은 sin값으로 <code>line</code> 을 plot한 것을 확인할 수 있습니다.</p>
<p><strong>ax 인수의 사용</strong></p>
<p><code>ax</code>인수를 통해 현재 axes값을 별도의 값으로 지정하여 plot에 사용할 수 있습니다.</p>
<pre><code class="language-python">fig, ax=plt.subplots(2) # 두개의 서브플롯에 ax를 배치하도록 fig를 설정
df.plot(kind=&#39;line&#39;, x=&#39;val&#39;, y=&#39;sin&#39;, ax=ax[0]) # sin그래프를 ax[0]으로 지정
df.plot(kind=&#39;line&#39;, x=&#39;val&#39;, y=&#39;tan&#39;, ax=ax[1]) # tan 그래프를 ax[1]으로 지정
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_3.png" alt=""></p>
<p>각각의 ax로 구분한 Axes를 2칸짜리 subplot에 배열하여 plot한것을 확인 할 수 있습니다.</p>
<p><strong>subplots 인수의 사용</strong></p>
<p><code>subplots</code>인수를 사용할 경우 각각의 열을 별도의 axes로 하여 subplot를 생성합니다.</p>
<p>※ 위 ax인수의 예시처럼 fig를 별도의 subplot 개체로 지정할 필요가 없습니다.</p>
<pre><code class="language-python">df2.plot(subplots=True)
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_4.png" alt=""></p>
<p>각각의 열이 별도의 subplot에 할당된 것을 확인할 수 있습니다.</p>
<p><strong>sharex / sharey 인수의 사용</strong></p>
<p>subplot을 이용할 경우 두 Axes의 x축이나 y축값을 맞출 수 있습니다.</p>
<p>이때 공유된 축의 경우 한쪽은 보이지 않게 됩니다.</p>
<p>sharex의 기본값은 True로 x축은 맞추게 되고, sharey의 기본값은 False로 y축은 별도로 출력하는것이 기본입니다.</p>
<pre><code class="language-python">df2.plot(subplots=True, sharex=False, sharey=True) # x축값을 별도로 출력하고 y축값을 공유하도록 변경
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_5.png" alt=""></p>
<p>x축값이 각각 그래프에 별도로 출력되는것을 확인 할 수 있습니다.</p>
<p>※subplot이 세로로 배열되어있기 때문에, shary=True인데 각각 출력이 됩니다. 가로로 배열되어있는상태라면 출력되지 않습니다.</p>
<p><strong>layout인수의 사용</strong></p>
<p><code>layout</code>인수를 이용하여 subplot의 배열을 설정할 수 있습니다. 튜플 형태로 값을 입력합니다.</p>
<pre><code class="language-python">df2.plot(subplots=True, layout=(2,2))
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_6.png" alt=""></p>
<p>fig가 2x2짜리 subplot으로 설정된 것을 확인할 수 있습니다.</p>
<p><strong>figsize인수의 사용</strong></p>
<p><code>figsize</code> 인수를 이용해서 figure의 크기를 지정할 수 있습니다. 단위는 inch입니다.</p>
<pre><code class="language-python">df2.plot(figsize=(10,4))
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_7.png" alt=""></p>
<p>fig의 크기가 변경된 것을 확인할 수 있습니다.</p>
<p><strong>title / grid 인수의 사용</strong></p>
<p><code>title</code>인수는 figure의 제목을 설정하고, <code>grid</code>인수는 격자 출력 여부를 설정할 수 있습니다.</p>
<pre><code class="language-python">df2.plot(title=&quot;Pandas plot method&quot;, grid=True)
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_8.png" alt=""></p>
<p>제목이 &quot;Pandas plot method&quot;로 설정되고, 격자가 설정된 것을 확인할 수 있습니다.</p>
<p><strong>linestyle 인수의 사용</strong></p>
<p><code>linestyle</code> 인수를 지정하여 출력되는 그래프의 선 스타일을 지정할 수 있습니다.</p>
<p>선의 종류에 대해서는 <a href="https://matplotlib.org/stable/gallery/lines_bars_and_markers/linestyles.html">matplotlib 홈페이지</a> 참고 바랍니다.</p>
<pre><code class="language-python">df2.plot(linestyle=&#39;dashed&#39;)
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_9.png" alt=""></p>
<p>선의 종류가 &quot;- -&quot; 형태인 &#39;dashed&#39;로 바뀐것을 확인 할 수 있습니다.</p>
<p><strong>logx / logy / loglog인수의 사용</strong></p>
<p><code>logs / logy / loglog</code>인수를 이용해 각 축의 표시형식을 log스케일로 변경할 수 있습니다.</p>
<p><code>loglog</code>인수는 모든 축의 값을 로그스케일로 변경합니다.</p>
<pre><code class="language-python">df2.plot(logx=True,logy=True) # df2.plot(loglog=True)
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_10.png" alt=""></p>
<p>각 축의 표기형태가 로그 스케일로 변경된 것을 확인할 수 있습니다.</p>
<p><strong>xticks / yticks 인수의 사용</strong></p>
<p><code>xticks / yticks</code> 인수에 리스트 형태의 값을 입력하여 특정 눈금의 값을 출력할 수 있습니다.</p>
<pre><code class="language-python">df.plot(kind=&#39;line&#39;, x=&#39;val&#39;,y=&#39;sin&#39;, xticks=[0,50,100],yticks=[0,0.5,1])
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_11.png" alt=""></p>
<p>x축의 눈금이 0, 50, 100 만 y축의 눈금이 0, 0.5, 1 만 표시된 것을 확인할 수 있습니다.</p>
<p><strong>xlim / ylim 인수의 사용</strong></p>
<p><code>xlim / ylim</code> 인수를 사용해 그래프의 출력 범위를 지정할 수 있습니다.</p>
<pre><code class="language-python">df.plot(kind=&#39;line&#39;, x=&#39;val&#39;,y=&#39;sin&#39;, xlim=[30,80],ylim=[0.25,0.75])
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_12.png" alt=""></p>
<p>그래프가 x축으로는 30<del>80의 범위가, y 축으로는 0.25</del>0.75의 범위가 출력 된 것을 확인할 수 있습니다.</p>
<p><strong>xlabel / ylabel 인수의 사용</strong></p>
<p><code>xlabel / ylabel</code> 인수를 사용해 각 축의 라벨을 출력할 수 있습니다.</p>
<pre><code class="language-python">df2.plot(xlabel=&#39;Width&#39;,ylabel=&#39;Height&#39;)
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_13.png" alt=""></p>
<p>각 축의 이름이 출력 된 것을 확인할 수 있습니다.</p>
<p><strong>rot / fontsize 인수의 사용</strong></p>
<p><code>rot</code> 인수를 이용해 눈금값의 기울기를 지정할 수 있고, <code>fontsize</code> 인수를 통해 눈금값의 크기를 지정할 수 있습니다.</p>
<pre><code class="language-python">df2.plot(rot=45,fontsize=20)
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_14.png" alt=""></p>
<p>그래프 눈금값의 기울기가 45도로, 눈금값의 크기가 20으로 변경된 것을 확인할 수 있습니다.</p>
<p><strong>colormap / colorbar 인수의 사용</strong></p>
<p><code>colormap</code> 은 출력되는 그래프의 값을 특정 색 범위로 표현하는 matplotlib의 기능입니다. <code>colorbar</code>는 색에 해당하는 값의 범위를 막대 형태로 출력하는 기능입니다.</p>
<p><code>colorbar</code>의 기본값은 True이기 때문에, False로 지정해주어야 출력이 안됩니다.</p>
<p><code>colorbar</code>를 적용하기 위해서는, 각 값에 대해서 색을 지정해 주어야합니다. <code>c</code>인수에 색의 값을 지정하는 열을 입력하여 가능합니다.</p>
<p><code>colormap</code>의 종류에 대해서는 <a href="https://matplotlib.org/stable/tutorials/colors/colormaps.html">matplolib 에서 지원하는 colormap 링크</a>을 참고 바랍니다.</p>
<pre><code class="language-python">data = {&#39;x_value&#39;:[4,7,3,1,2],&#39;y_value&#39;:[1,2,3,4,5],&#39;color_bar&#39;:[0,1,2,3,4]}#x축에 표시될 값들,y축에 표시될 값들,각 점의 색을 결정할 값 (컬러바)
df3 = pd.DataFrame(data)
df3.plot(kind=&#39;scatter&#39;,x=&#39;x_value&#39;,y=&#39;y_value&#39;,c=&#39;color_bar&#39;, colormap=&#39;cool&#39;,colorbar=True) # c인수로 color_bar 열을 지정.
# 산점도 그래프 (scatter plot)로 그림, x축은 &#39;x_value&#39; 열 사용, 축은 &#39;y_value&#39; 열 사용,각 점의 색을 &#39;color_bar&#39; 열 값에 따라 다르게 지정, 색상 맵(colormap) 지정 (&#39;cool&#39;은 보라-청록 계열), 색상 기준을 옆에 colorbar로 시각적으로 표시
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_15.png" alt=""></p>
<p><img src="attachment:b02f56c0-55eb-466d-ae35-070d7931bc31:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-20_185150.png" alt="스크린샷 2025-05-20 185150.png"></p>
<p><code>c=&#39;color_bar&#39;</code>를 통해 색범위를 0~4로 정해주었고, 각 y값에 대해서 색값을 지정해주었습니다.</p>
<p>그에 맞게 <code>colormap</code>과 <code>colorbar</code>가 적용된 것을 확인할 수 있습니다.</p>
<p><strong>position 인수의 사용</strong></p>
<p><code>position</code>인수는 막대그래프 &#39;bar / barh&#39;에대해서 막대의 위치가 눈금의 위치 {좌측(0), 중(0.5), 우측(1)}를 지정할 수 있습니다.</p>
<pre><code class="language-python">data = {&#39;x_value&#39;:[4,7,3,1,2],&#39;y_value&#39;:[1,2,3,4,5],&#39;color_bar&#39;:[0,1,2,3,4]}
df3 = pd.DataFrame(data)
fig, ax=plt.subplots(3) # 3칸짜리 subplot을 갖는 fig 개체 설정
df3.plot(kind=&#39;bar&#39;,x=&#39;x_value&#39;,y=&#39;y_value&#39;,position=0,ax=ax[0])
df3.plot(kind=&#39;bar&#39;,x=&#39;x_value&#39;,y=&#39;y_value&#39;,position=0.5,ax=ax[1])
df3.plot(kind=&#39;bar&#39;,x=&#39;x_value&#39;,y=&#39;y_value&#39;,position=1,ax=ax[2])
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_16.png" alt=""></p>
<p>각각 그래프에서 눈금의 위치와 막대 그래프의 위치를 비교해보면 <code>position</code>인수가 어떻게 적용되는지 확인할 수 있습니다.</p>
<p><strong>xerr / yerr인수의 사용</strong></p>
<p><code>xerr / yerr</code>인수는 특정 축을 기존그래프의 오차범위로 설정하는 인수 입니다.</p>
<pre><code class="language-python">data = {&#39;x_value&#39;:[1,2,3,4,5],&#39;y_value&#39;:[2,5,3,7,1],&#39;err&#39;:[0.1,0.3,0.6,1.0,0.1]}
df4 = pd.DataFrame(data)
fig, ax=plt.subplots(2)
df4.plot(kind=&#39;bar&#39;,x=&#39;x_value&#39;,y=&#39;y_value&#39;,yerr=&#39;err&#39;,ax=ax[0])
df4.plot(kind=&#39;barh&#39;,x=&#39;x_value&#39;,y=&#39;y_value&#39;,xerr=&#39;err&#39;,ax=ax[1])
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_17.png" alt=""></p>
<p>기존 x_value / y_value 막대그래프에 대해서 작은 선 형태로 err 열이 오차범위로써 덧 씌워진 것을 확인할 수 있습니다.</p>
<p><strong>stacked 인수의 사용</strong></p>
<p>막대그래프의 경우 값이 여러개라면 <code>stacked</code>인수를 통해 누적 막대그래프의 형태로 변환이 가능합니다.</p>
<pre><code class="language-python">data = {&#39;x_value&#39;:[1,2,3,4,5],&#39;y_value&#39;:[2,5,3,7,1],&#39;err&#39;:[0.1,0.3,0.6,1.0,0.1]}
df4 = pd.DataFrame(data)
df4.plot(kind=&#39;bar&#39;,x=&#39;x_value&#39;,y=[&#39;y_value&#39;,&#39;err&#39;],stacked=True)
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_18.png" alt=""></p>
<p><code>y</code>의 값을 리스트 형태로 두 컬럼을 입력하여 두 막대그래프를 출력하도록 한 다음 <code>stacked=True</code>로 하여 누적 막대그래프가 된 것을 확인할 수 있습니다.</p>
<p><strong>secondary_y 인수의 사용</strong></p>
<p>두 그래프를 출력 할 경우 한 Axes를 다른 Axes에 종속시킴으로서 종속된 Axes를 <code>secondary_y</code> 인수를 이용해 보조 축으로 표현할 수 있습니다.</p>
<pre><code class="language-python">data = {&#39;x_value&#39;:[1,2,3,4,5],&#39;y_value&#39;:[2,5,3,7,1],&#39;err&#39;:[0.1,0.3,0.6,1.0,0.1]}
df4 = pd.DataFrame(data)
ax1 = df4.plot(x=&#39;x_value&#39;,y=&#39;y_value&#39;,color=&#39;Red&#39;,) # y_value를 ax1로
ax2 = df4.plot(x=&#39;x_value&#39;,y=&#39;err&#39;,ax=ax1,secondary_y=True) # err을 ax2로하여 ax1에 종속 및 보조축 설정
ax1.set_ylabel(&#39;y_value&#39;) # 라벨 설정
ax2.set_ylabel(&#39;err&#39;)
</code></pre>
<p><img src="https://wikidocs.net/images/page/159927/Figure_19.png" alt=""></p>
<p>ax1를 생성하고 ax2를 ax1에 종속시키면서 <code>secondary_y=True</code>로 하여 우측에 보조축이 생성된 것을 확인할 수 있습니다.</p>
<h1 id="xy축-지정-area--bar--barh--line"><strong>x,y축 지정 (area / bar / barh / line)</strong></h1>
<pre><code class="language-python">val = np.linspace(0,100,101)
sin = np.sin(np.pi/25*val)+1
cos = np.cos(np.pi/25*val)+1
df = pd.DataFrame(data={&#39;val&#39;:val,&#39;sin+1&#39;:sin,&#39;cos+1&#39;:cos})
print(df)
&gt;&gt;
       val     sin+1     cos+1
0      0.0  1.000000  2.000000
1      1.0  1.125333  1.992115
2      2.0  1.248690  1.968583
3      3.0  1.368125  1.929776
4      4.0  1.481754  1.876307
..     ...       ...       ...
96    96.0  0.518246  1.876307
97    97.0  0.631875  1.929776
98    98.0  0.751310  1.968583
99    99.0  0.874667  1.992115
100  100.0  1.000000  2.000000
</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p><code>plot.[area / bar / barh / line]</code> 메서드는 반드시 x축과 y축(값)을 지정해주어야 합니다.</p>
<p><strong>area메서드의 사용</strong></p>
<p><code>plot.area</code> 메서드는 데이터를 면적 그래프의 형태로 반환합니다. 기본적으로 <code>stacked=True</code> 이므로, 면적이 누적되는 형태로 출력됩니다.</p>
<pre><code class="language-python">df.plot.area(x=&#39;val&#39;,y=[&#39;sin+1&#39;,&#39;cos+1&#39;],stacked=True) #stacked=True는 기본값
#sin과 cos 사인은 -1~+1까지 나타내기 때문에 1부터 시작하기 위헤서 1을 더한거다
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/160034/Figure_1.png" alt=""></p>
<p><code>stacked=False</code>인 경우 면적이 겹치는것을 시각화 하여 보여줍니다.</p>
<pre><code class="language-python">df.plot.area(x=&#39;val&#39;,y=[&#39;sin+1&#39;,&#39;cos+1&#39;],stacked=False)
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/160034/Figure_2.png" alt=""></p>
<p><strong>bar / barh 메서드의 사용</strong></p>
<p><code>plot.bar / plot.barh</code>는 각각 세로 막대그래프, 가로 막대 그래프를 반환합니다.</p>
<pre><code class="language-python">df.plot.bar(x=&#39;val&#39;,y=[&#39;sin+1&#39;,&#39;cos+1&#39;])#plot.bar 세로 막대그래프
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/160034/Figure_3.png" alt=""></p>
<pre><code class="language-python">df.plot.barh(x=&#39;val&#39;,y=[&#39;sin+1&#39;,&#39;cos+1&#39;])#가로 막대그래프
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/160034/Figure_4.png" alt=""></p>
<p><strong>line 메서드의 사용</strong></p>
<p><code>plot.line</code> 메서드는 선형 그래프를 반환합니다.</p>
<pre><code class="language-python">df.plot.line(x=&#39;val&#39;,y=[&#39;sin+1&#39;,&#39;cos+1&#39;])#선형 그래프
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/160034/Figure_5.png" alt=""></p>
<h1 id="xy축-c값-지정-hexbin--scatter"><strong>x,y축, c값 지정 (hexbin / scatter)</strong></h1>
<p><code>x / y</code> : 각 축으로 설정할 값(컬럼명) 입니다.</p>
<p><code>c</code> : 각 값에 대한 colorbar의 값을 지정할 수 있습니다.</p>
<p><code>kwargs</code> : 그 외에 matplotlib 중 plot에서 지원하는 인수의 사용이 가능합니다.</p>
<p>먼저 기본적인 사용법 예시를위하여 데이터를 만들어 보겠습니다.</p>
<p><code>df</code>는 크기 10000짜리 가우시안 표준 정규분포 <code>x</code>와 <code>y</code>, 그리고 0~10까지의 난수를 갖는 1000개짜리 <code>c</code>열 의 데이터입니다.</p>
<pre><code class="language-python">df = pd.DataFrame({&#39;x&#39;:np.random.randn(10000),
                   &#39;y&#39;:np.random.randn(10000),
                   &#39;c&#39;:np.random.randint(0,10,size=10000)})
&gt;&gt;
             x         y  c
0     0.987301  0.239920  4
1    -0.466582  0.432507  4
2     0.462679  0.869407  7
3     0.547113 -1.123641  8
4     0.046728 -1.220947  6
...        ...       ... ..
9995  0.241341 -0.598799  0
9996 -1.694559  1.428881  5
9997  0.929081 -1.504374  9
9998  1.561134  1.445425  5
9999  2.113502  0.611024  7

[10000 rows x 3 columns]
</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p><code>plot.[hexbin / scatter]]</code> 메서드는 반드시 x축과 y축(값)을 지정해주어야 합니다. (colormap은 자동으로 지정되며, c는 선택)</p>
<p><strong>hexbin메서드의 사용</strong></p>
<p><code>hexbin</code> 메서드는 육각형의 그리드형태로 값을 반환하는 그래프 입니다. <code>gridsize 인수</code> 는 x축 기준 그리드 한칸의 크기를 의미합니다.</p>
<p><code>colormap</code> 인수는 자동 지정되나, 원하는 colormap으로 지정이 가능합니다.</p>
<pre><code class="language-python">df.plot.hexbin(x=&#39;x&#39;,y=&#39;y&#39;,gridsize=20,colormap=&#39;viridis&#39;)
plt.show()
</code></pre>
<p><img src="attachment:c1fbbcf8-44ea-4dee-8025-b8c71d3710bb:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-20_190529.png" alt="스크린샷 2025-05-20 190529.png"></p>
<p><strong>C 인수의 사용</strong></p>
<p><code>C</code> 인수를 통해 colormap 기준으로 각 값이 colorbar에서 어떤 값을 취할지 지정할 수 있습니다.</p>
<pre><code class="language-python">df.plot.hexbin(x=&#39;x&#39;,y=&#39;y&#39;,gridsize=20,colormap=&#39;jet&#39;,C=&#39;c&#39;)
plt.show()
</code></pre>
<p><img src="attachment:99970c5d-33f6-4764-bb91-be4f21c03a44:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-20_190641.png" alt="스크린샷 2025-05-20 190641.png"></p>
<p><strong>reduce_C_function 인수의 사용</strong></p>
<p><code>reduce_C_function</code> 인수는 colorbar의 값에 대해서 그래프의 bin(한칸의 가로사이즈)에 속하는 값들이 하나의 대표값으로 통일하게 해주는 np 메서드를 지정하는 인수입니다.</p>
<pre><code class="language-python">df.plot.hexbin(x=&#39;x&#39;,y=&#39;y&#39;,gridsize=20,colormap=&#39;cool&#39;,C=&#39;c&#39;,reduce_C_function=np.max)
plt.show()
</code></pre>
<p><img src="attachment:ec2470c5-6a4a-4f5d-a00a-f2a40ad0968a:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-20_190811.png" alt="스크린샷 2025-05-20 190811.png"></p>
<p>colorbar에 대해서 한 bin의 값들이 해당값의 max값으로 통일 되어 반환되는것을 확인 할 수 있습니다.</p>
<hr>
<p><strong>scatter메서드의 사용</strong></p>
<p><code>scatter</code>는 점산도 그래프를 반환하는 메서드입니다.</p>
<p><code>s</code>인수는 점의 크기를 스칼라값으로 지정 가능하며, <code>c</code>인수를 통해 각 값이 colorbar에서 어떤 값을 취할지 지정 가능합니다.</p>
<pre><code class="language-python">df.plot.scatter(x=&#39;x&#39;,y=&#39;y&#39;,s=3,c=&#39;c&#39;,colormap=&#39;viridis&#39;)
plt.show()
</code></pre>
<p><img src="attachment:eaf5c8d5-c0d2-4ee3-a8cf-6a6e31f6b758:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-20_190946.png" alt="스크린샷 2025-05-20 190946.png"></p>
<h1 id="축-설정-불필요-box--hist--pie"><strong>축 설정 불필요 (box / hist / pie)</strong></h1>
<pre><code class="language-python">data = np.random.randn(100,2)
df = pd.DataFrame(data, columns = [&#39;x&#39;,&#39;y&#39;])
print(df)
&gt;&gt;
           x         y
0   1.476916 -1.549051
1   0.156672  1.601624
2   0.493568  0.096696
3  -0.550939  0.200391
4   0.885276  0.613648
..       ...       ...
95 -0.048403  2.432448
96  0.020946  0.900305
97  0.128520  0.514659
98  0.369856  1.519807
99  0.928380  0.105314

[100 rows x 2 columns]</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p><code>plot.[box / hist / pie]]</code> 메서드는 각 열의 데이터를 가져오기 때문에 x축, y축등을 지정해 줄 필요가 없습니다.</p>
<p><strong>box메서드의 사용</strong></p>
<p><code>box</code> 메서드의 경우 boxplot을 출력합니다.</p>
<p><code>df.plot.box</code>메서드는 <code>df.boxplot</code>메서드와 동일한 기능을 수행합니다.</p>
<pre><code class="language-python">data = np.random.randn(100,2)
df = pd.DataFrame(data, columns = [&#39;x&#39;,&#39;y&#39;])
df.plot.box()
plt.show()
</code></pre>
<p><img src="attachment:6cbc43a0-1880-44e0-81e8-08c3164e6699:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-20_191744.png" alt="스크린샷 2025-05-20 191744.png"></p>
<p><strong>hist 메서드의 사용</strong></p>
<p><code>hist</code> 메서드의 경우 histogram을 출력합니다. <code>bins</code> 인수를통해 막대 하나의 크기를 정할 수 있으며, alpha를 통해 투명도를 설정할 수 있습니다.</p>
<p><code>df.plot.hist</code>메서드는 <code>df.hist</code>메서드와 동일한 기능을 수행합니다.</p>
<pre><code class="language-python">data = np.random.randn(100,2)
df = pd.DataFrame(data, columns = [&#39;x&#39;,&#39;y&#39;])
df.plot.hist(bins=20,alpha=0.5,color=[&#39;green&#39;,&#39;blue&#39;]) # bins로 막대 크기20, alpha로 투명도 0.5, 색은 초록-파랑 설정
plt.show()
</code></pre>
<p><img src="attachment:97e9300e-6c00-4596-a84b-f461e9f3558f:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-20_191839.png" alt="스크린샷 2025-05-20 191839.png"></p>
<p><strong>pie 메서드의 사용</strong></p>
<p><code>pie</code>메서드는 원형 그래프를 출력하는 메서드 입니다. 열의 갯수만큼의 원형그래프가 생성되므로 서브플롯을 설정해주어야합니다.</p>
<pre><code class="language-python">data = {&#39;x&#39;:[3,7,9],&#39;y&#39;:[2,6,3]}
idx = [&#39;A&#39;,&#39;B&#39;,&#39;C&#39;]
df = pd.DataFrame(data=data, index= idx)
df.plot.pie(subplots=True)
plt.show()
</code></pre>
<p><img src="https://wikidocs.net/images/page/160069/Figure_3.png" alt=""></p>
<h1 id="커널밀도추정-그래프-kde--density"><strong>커널밀도추정 그래프 (kde / density)</strong></h1>
<p><code>bw_method</code> : 대역폭을 지정합니다. 대역폭이 작을수록 더 자세한 smoothing이 가능하고, 대역폭이 크면 러프한 smoothing이 수행됩니다.</p>
<p><code>ind</code> : 예상 PDF에 대한 평가 포인트입니다. 기본값은 1000개의 타점이며, numpy array나 리스트형태로 입력 할 경우 해당 포인트로 계산이 수행됩니다.</p>
<p><code>kwargs</code> : matplotlib 중 plot에서 지원하는 인수의 사용이 가능합니다.</p>
<h2 id="예시"><strong>예시</strong></h2>
<p>먼저 기본적인 사용법 예시를위하여 데이터를 만들어 보겠습니다.</p>
<p><code>df</code>는 크기 1000짜리 가우시안 표준 정규분포 <code>value</code>열의 데이터입니다.</p>
<pre><code class="language-python">data = np.random.randn(1000,1)
df = pd.DataFrame(data,columns=[&#39;value&#39;])
print(df)
&gt;&gt;
        value
0   -0.307367
1    0.310514
2    1.135779
3   -0.584566
4    0.859781
..        ...
995  0.449085
996 -0.513770
997 -0.782740
998  1.250284
999  0.566071

[1000 rows x 1 columns]
</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p>커널밀도추정(KDE)는 간단히 말하면 데이터의 histogram을 smoothing하는 것이라고 볼 수 있습니다.(실제로는 더 복잡한 의미를 가집니다.)</p>
<p>50bin 짜리 histogram과 함께 <code>kde</code> 메서드를 수행해서 비교해보겠습니다.</p>
<pre><code class="language-python">data = np.random.randn(1000,1)
df = pd.DataFrame(data,columns=[&#39;value&#39;])
ax = df.plot.hist(bins=50)
df.plot.kde(ax=ax,secondary_y=True)
plt.show()
</code></pre>
<p><img src="attachment:8694cb95-f6df-4017-b62e-56387a646893:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-20_192056.png" alt="스크린샷 2025-05-20 192056.png"></p>
<p><strong>bw_method 인수의 사용</strong></p>
<p><code>bw_method</code> 인수를이용해 대역폭(bandwidth)를 설정할 수 있습니다. <code>bw_method</code>가 작을수록 더욱 세부적인 계산이 수행됩니다.</p>
<pre><code class="language-python">data = np.random.randn(1000,1)
df = pd.DataFrame(data,columns=[&#39;value&#39;])
ax = df.plot.hist(bins=50)
df.plot.kde(ax=ax,secondary_y=True,bw_method=0.1)
df.plot.kde(ax=ax,secondary_y=True,bw_method=3)
plt.show()
</code></pre>
<p>주황색 line의 0.1짜리 대역폭과, 녹색 line의 3짜리 대역폭의 차이점을 볼 수 있습니다.</p>
<p><img src="attachment:651098c2-0be0-4df4-b5f2-f99c81d4a499:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-20_192246.png" alt="스크린샷 2025-05-20 192246.png"></p>
<p><strong>ind 인수의 사용</strong></p>
<p><code>ind</code> 인수를 통해 계산이 수행되는 지점을 지정할 수 있습니다.</p>
<pre><code class="language-python">data = np.random.randn(1000,1)
df = pd.DataFrame(data,columns=[&#39;value&#39;])
ax = df.plot.hist(bins=50)
df.plot.kde(ax=ax,secondary_y=True)
df.plot.kde(ax=ax,secondary_y=True,ind=[-6,-4,-2,0,2,4,6],color=&#39;red&#39;)
plt.show()
</code></pre>
<p><img src="attachment:6659fc2f-85b1-4320-8d78-30ea99c48e56:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-20_192330.png" alt="스크린샷 2025-05-20 192330.png"></p>
<p>붉은색 line이 특정 지점을 기준으로 계산 된 것을 확인 할 수 있습니다.</p>
<h1 id="간단한-문제-풀이">간단한 문제 풀이</h1>
<h3 id="dataframegroupby-max-min"><strong>DataFrame.groupby max, min</strong></h3>
<p>위 데이터프레임에서 테마별 PER, PBR의 최대, 최소값을 계산하세요.</p>
<pre><code class="language-python">data = [
    [&quot;2차전지(생산)&quot;, &quot;SK이노베이션&quot;, 10.19, 1.29],
    [&quot;해운&quot;, &quot;팬오션&quot;, 21.23, 0.95],
    [&quot;시스템반도체&quot;, &quot;티엘아이&quot;, 35.97, 1.12],
    [&quot;해운&quot;, &quot;HMM&quot;, 21.52, 3.20],
    [&quot;시스템반도체&quot;, &quot;아이에이&quot;, 37.32, 3.55],
    [&quot;2차전지(생산)&quot;, &quot;LG화학&quot;, 83.06, 3.75]
]

columns = [&quot;테마&quot;, &quot;종목명&quot;, &quot;PER&quot;, &quot;PBR&quot;]
df = pd.DataFrame(data=data, columns=columns)
print(df)
         테마      종목명    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=&quot;테마&quot;).max()
df.groupby(by=&quot;테마&quot;).min()
&gt;&gt;
    종목명    PER    PBR
테마            
2차전지(생산)    LG화학    10.19    1.29
시스템반도체    아이에이    35.97    1.12
해운    HMM    21.23    0.95

#2번정답

df.groupby(by=&quot;테마&quot;).size()
df.groupby(by=&quot;테마&quot;).size()
&gt;&gt;
0
테마    
2차전지(생산)    2
시스템반도체    2
해운    2

dtype: int64
#3번정답
df.groupby(by=&quot;테마&quot;).get_group(&quot;2차전지(생산)&quot;)
&gt;&gt;
테마    종목명    PER    PBR
0    2차전지(생산)    SK이노베이션    10.19    1.29
5    2차전지(생산)    LG화학    83.06    3.75

#4번정답
찐 df.groupby(&quot;테마&quot;)[[&quot;PER&quot;]].mean()
df.groupby(by=&quot;테마&quot;).mean(&quot;PER&quot;,&quot;PBR&quot;)
&gt;&gt;
    PER    PBR
테마        
2차전지(생산)    46.625    2.520
시스템반도체    36.645    2.335
해운    21.375    2.075
#5번정답
df.groupby(&quot;테마&quot;)[[&quot;PER&quot;, &quot;PBR&quot;]].mean()
&gt;&gt;

PER    PBR
테마        
2차전지(생산)    46.625    2.520
시스템반도체    36.645    2.335
해운    21.375    2.075
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-05-19]]></title>
            <link>https://velog.io/@smile_07/2025-05-19</link>
            <guid>https://velog.io/@smile_07/2025-05-19</guid>
            <pubDate>Mon, 19 May 2025 10:53:54 GMT</pubDate>
            <description><![CDATA[<h1 id="dict로-변환-to_dict"><strong>dict로 변환 (to_dict)</strong></h1>
<p><code>to_dict</code> 메서드는 데이터프레임 객체를 <code>dict</code> 형태로 변환하는 메서드 입니다.</p>
<p><code>orient</code> : 출력할 dict의 형태를 지정합니다. 형태는 아래와 같습니다.</p>
<blockquote>
<p>dict : {열 : {행 : 값, 행 : 값}, 열 : {행 : 값, 행 : 값}</p>
<p>list : {열 : [ 값 ], 열 : [ 값 ] }</p>
<p>series : {열 : Series, 열 : Series}</p>
<p>split : { index : [ 행, 행 ], columns : [ 열, 열 ], data : [ 값, 값 ] }</p>
<p>records : [ { 열 : 값 , 열 : 값 }, { 열 : 값, 열 : 값 } ]</p>
<p>index : { 행 : {열 : 값, 열 : 값}, 행 : {열 : 값, 열 : 값} }</p>
</blockquote>
<p><code>into</code> : 반환값의 모든 매핑에 사용되는 collections.abc.Mapping 하위클래스입니다.</p>
<pre><code class="language-python">Copydf = pd.DataFrame([[1,2],[3,4]], columns=[&#39;col1&#39;,&#39;col2&#39;],index=[&#39;row1&#39;,&#39;row2&#39;])
print(df)
&gt;&gt;
      col1  col2
row1     1     2
row2     3     4</code></pre>
<p><code>orient</code> 인수를 설정함으로써 출력되는 <code>dict</code>객체의 형태를 정할 수 있습니다.</p>
<p><code>orient = &#39;dict&#39;</code>인 경우 <code>{열 : {행 : 값, 행 : 값}, 열 : {행 : 값, 행 : 값}</code> 형태로 변환합니다.</p>
<pre><code class="language-python">print(df.to_dict(orient=&#39;dict&#39;))
&gt;&gt;
{&#39;col1&#39;: {&#39;row1&#39;: 1, &#39;row2&#39;: 3}, &#39;col2&#39;: {&#39;row1&#39;: 2, &#39;row2&#39;: 4}}
</code></pre>
<p><code>orient = &#39;list&#39;</code>인 경우 <code>{열 : [ 값 ], 열 : [ 값 ] }</code> 형태로 변환합니다.</p>
<pre><code class="language-python">print(df.to_dict(orient=&#39;list&#39;))
&gt;&gt;
{&#39;col1&#39;: [1, 3], &#39;col2&#39;: [2, 4]}
</code></pre>
<p><code>orient = &#39;series&#39;</code>인 경우 <code>{열 : Series, 열 : Series}</code> 형태로 변환합니다.</p>
<pre><code class="language-python">print(df.to_dict(orient=&#39;series&#39;))
&gt;&gt;
{&#39;col1&#39;: row1    1
row2    3
Name: col1, dtype: int64, &#39;col2&#39;: row1    2
row2    4
Name: col2, dtype: int64}
</code></pre>
<p><code>orient = &#39;split&#39;</code>인 경우 <code>{ index : [ 행, 행 ], columns : [ 열, 열 ], data : [ 값, 값 ] }</code> 형태로 변환합니다.</p>
<pre><code class="language-python">print(df.to_dict(orient=&#39;split&#39;))
&gt;&gt;
{&#39;index&#39;: [&#39;row1&#39;, &#39;row2&#39;], &#39;columns&#39;: [&#39;col1&#39;, &#39;col2&#39;], &#39;data&#39;: [[1, 2], [3, 4]]}
</code></pre>
<p><code>orient = &#39;records&#39;</code>인 경우 <code>[ { 열 : 값 , 열 : 값 }, { 열 : 값, 열 : 값 } ]</code> 형태로 변환합니다.</p>
<pre><code class="language-python">print(df.to_dict(orient=&#39;records&#39;))
&gt;&gt;
[{&#39;col1&#39;: 1, &#39;col2&#39;: 2}, {&#39;col1&#39;: 3, &#39;col2&#39;: 4}]
</code></pre>
<p><code>orient = &#39;index&#39;</code>인 경우 <code>{ 행 : {열 : 값, 열 : 값}, 행 : {열 : 값, 열 : 값} }</code> 형태로 변환합니다.</p>
<pre><code class="language-python">Copyprint(df.to_dict(orient=&#39;index&#39;))
&gt;&gt;
{&#39;row1&#39;: {&#39;col1&#39;: 1, &#39;col2&#39;: 2}, &#39;row2&#39;: {&#39;col1&#39;: 3, &#39;col2&#39;: 4}}</code></pre>
<h1 id="markdown으로-변환-to_markdown"><strong>Markdown으로 변환 (to_markdown)</strong></h1>
<p>마크다운은 노션에 쓴다 </p>
<p><code>buf</code> : 쓸 버퍼입니다. 입력하지 않으면 문자열이 반환됩니다.</p>
<p><code>mode</code> : 파일을 열때 모드입니다. 기본값은 &#39;wt&#39;입니다.</p>
<p><code>index</code> : 인덱스를 출력할지 여부입니다. 기본값은 True입니다.</p>
<p><code>storage_options</code> : 특정 스토리지 연결에 적합한 추가 옵션을 지정합니다. (예 : 호스트, 포트, 사용자 이름, 비밀번호 등)</p>
<p><code>kwargs</code> : 추가 적용 가능한 <a href="https://pypi.org/project/tabulate/">tabulate</a>의 키워드입니다.</p>
<pre><code class="language-python">df = pd.DataFrame([[1,2],[3,4]], columns=[&#39;col1&#39;,&#39;col2&#39;],index=[&#39;row1&#39;,&#39;row2&#39;])
print(df)
&gt;&gt;
      col1  col2
row1     1     2
row2     3     4
</code></pre>
<pre><code class="language-python">print(df.to_markdown())
&gt;&gt;
|      |   col1 |   col2 |
|:-----|-------:|-------:|
| row1 |      1 |      2 |
| row2 |      3 |      4 |
</code></pre>
<p>실제 Markdown으로 출력시 아래와 같이 출력 됩니다.</p>
<p>| | col1 | col2 | |:-----|-------:|-------:| | row1 | 1 | 2 | | row2 | 3 | 4 |</p>
<p><strong>index인수의 사용</strong></p>
<p><code>index=False</code>로 입력할 경우 인덱스가 제외됩니다.</p>
<pre><code class="language-python">print(df.to_markdown(index=False))
&gt;&gt;
|   col1 |   col2 |
|-------:|-------:|
|      1 |      2 |
|      3 |      4 |</code></pre>
<table>
<thead>
<tr>
<th>이유</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>간단한 문법</strong></td>
<td>복잡한 태그 없이도 서식을 표현 가능</td>
</tr>
<tr>
<td><strong>범용성</strong></td>
<td>다양한 플랫폼에서 사용됨</td>
</tr>
<tr>
<td><strong>변환 용이성</strong></td>
<td>HTML, PDF 등으로 손쉽게 변환</td>
</tr>
<tr>
<td><strong>가독성</strong></td>
<td>원본 텍스트도 읽기 쉬움</td>
</tr>
</tbody></table>
<h1 id="string으로-변환to_string"><strong>string으로 변환(to_string)</strong></h1>
<p><code>buf</code> : 저장할 버퍼 입니다. None이면 문자열로 출력됩니다.</p>
<p><code>columns</code> : 출력할 열을 지정합니다.</p>
<p><code>col_space</code> : 열 너비를 지정합니다. .</p>
<p><code>header / index</code> : 열/행 레이블의 출력 여부 입니다. False이면 출력하지 않습니다.</p>
<p>리스트 형태로 입력하여 레이블명의 변경이 가능합니다.</p>
<p><code>na_rep</code> : 결측값의 표현 방식 입니다.</p>
<p><code>formatters</code> : 포매터 함수를 통해 값의 포맷을 설정합니다. <code>.format()</code> 메서드도 사용 가능합니다.</p>
<p><code>float_format</code> : 소수점 단위 자리수를 지정합니다. 기본은 마침표( . ) 입니다.</p>
<p><code>sparsify</code> : 각 행의 모든 다중 인덱스 키를 인쇄하려면 계층적 인덱스가 있는 DataFrame에 대해 False로 설정합니다.</p>
<p><code>index_names</code> : 인덱스명을 출력할지를 정합니다.</p>
<p><code>justify</code> : 정렬 방식을 지정합니다.</p>
<p><code>maxrows</code> : 최대 출력할 줄 수를 지정합니다. 초과되는 줄은 ( ... )형태로 축약됩니다.</p>
<p><code>maxcols</code> : 최대 출력할 열 수를 지정합니다. 초과되는 줄은 ( ... )형태로 축약됩니다.</p>
<p><code>show_dimensions</code> : 출력된 html 객체 아래에 데이터 객체의 차원을 출력합니다.</p>
<p><code>decimal</code> : 1000단위 구분기호로 인식되는 문자를 지정합니다.</p>
<p><code>linewidth</code> : 문자로 줄바꿈할 너비 입니다.</p>
<p><code>minrow</code> : maxrows로인해 잘린 표현을 표시할 수 입니다.</p>
<p><code>max_colwidth</code> : 각 열을 문자열로 자르기 위한 최대 너비입니다. 기본값은 무제한 입니다.</p>
<p><code>encoding</code> : 인코딩을 지정합니다.</p>
<h2 id="예시"><strong>예시</strong></h2>
<p>먼저 기본적인 사용법 예시를위하여 3x2 데이터를 만들어 보겠습니다.</p>
<pre><code class="language-python">data = [[1,np.NaN],[&#39;A&#39;,4.179],[&#39;&lt;&amp;&gt;&#39;,32000]]
df = pd.DataFrame(data,columns=[&#39;col1&#39;,&#39;col2&#39;])
df=df.rename_axis(columns=&#39;index&#39;)
print(df)
&gt;&gt;
index col1       col2
0        1        NaN
1        A      4.179
2      &lt;&amp;&gt;  32000.000
</code></pre>
<p><strong>columns 인수의 사용</strong></p>
<p><code>columns</code> 인수를 입력하여 특정 열만 출력이 가능합니다. <code>list</code> 형태로 입력하여야합니다</p>
<pre><code class="language-python">print(df.to_string(columns=[&#39;col2&#39;])) # col2만 출력
&gt;&gt;
index       col2
0            NaN
1          4.179
2      32000.000
</code></pre>
<p><strong>col_space 인수의 사용</strong></p>
<p><code>col_space</code> 인수를 입력하여 열 너비를 지정할 수 있습니다.</p>
<pre><code class="language-python">print(df.to_string(col_space=[10,20]))#열 너비를 지정해준다
&gt;&gt;
index       col1                 col2
0              1                  NaN
1              A                4.179
2            &lt;&amp;&gt;            32000.000
</code></pre>
<p><strong>header 인수의 사용</strong></p>
<p><code>header</code> 인수를 입력하여 열 이름을 지정할 수 있습니다. True 나 False, None를 입력하여 출력 여부를 설정할 수도 있습니다.</p>
<pre><code class="language-python">print(df.to_string(header=[&#39;val1&#39;,&#39;val2&#39;]))#col1 col2를 val1,2으로 바꿧습니다
&gt;&gt;
index val1       val2
0        1        NaN
1        A      4.179
2      &lt;&amp;&gt;  32000.000
</code></pre>
<p><strong>index인수의 사용</strong></p>
<p><code>index</code> 인수를 이용해 index의 출력 여부를 정할 수 있습니다.</p>
<pre><code class="language-python">print(df.to_string(index=False))#인덱스의 출력여부
&gt;&gt;
col1      col2
   1       NaN
   A     4.179
 &lt;&amp;&gt; 32000.000
</code></pre>
<p><strong>na_rep 인수의 사용</strong></p>
<p><code>na_rep</code>인수를 입력하여 결측치(NaN등)의 표현값을 변경할 수 있습니다.</p>
<pre><code class="language-python">print(df.to_string(na_rep=&#39;결측&#39;))#결측치 값을 변경한다
&gt;&gt;
index col1       col2 # 결측치가 &#39;결측&#39; 으로 변경
0        1         결측
1        A      4.179
2      &lt;&amp;&gt;  32000.000
</code></pre>
<p><strong>index_names인수의 사용</strong></p>
<p><code>index_names</code>를 설정함으로서 인덱스명의 출력 여부를 정할 수 있습니다. 기본값은 True입니다.</p>
<pre><code class="language-python">
`justify` 인수를 사용해 인덱스를 정렬할 수 있습니다.
사용 가능한 값 : {left / right / center / justify / justify-all / start / end / inherit / match-parent / initial / unset}
&gt;&gt;
index col1  col2      #인덱스가 왼쪽 정렬되어서 붙어 있는걸 알 수 있음
0        1        NaN
1        A      4.179
2      &lt;&amp;&gt;  32000.000
</code></pre>
<p><strong>max_raws / max_cols 인수의 사용</strong></p>
<p><code>max_raws / max_cols</code> 인수를 사용해 출력할 최대 행/열 수를 지정할 수 있습니다. 초과분은 ( ... )로 함축되어 표현됩니다.</p>
<pre><code class="language-python">print(df.to_string(max_rows=2))#2행만 출력되면서 1행이 ...으러 함축되어 표현됨
&gt;&gt;
index col1     col2
0        1      NaN
..     ...      ...
2      &lt;&amp;&gt;  32000.0
</code></pre>
<pre><code class="language-python">print(df.to_string(max_cols=1))
&gt;&gt;
index col1  ...
0        1  ...
1        A  ...
2      &lt;&amp;&gt;  ...
</code></pre>
<p><strong>show_dimensions인수의 사용</strong></p>
<p><code>show_dimensions</code>인수를 이용하여 데이터의 차원을 출력할 수 있습니다.</p>
<pre><code class="language-python">print(df.to_string(show_dimensions=True))
&gt;&gt;
index col1       col2
0        1        NaN
1        A      4.179
2      &lt;&amp;&gt;  32000.000

[3 rows x 2 columns] # 데이터의 차원이 출력됨, 3행 * 2
</code></pre>
<p><strong>decimal 인수의 사용</strong></p>
<p><code>decimal</code>인수를 사용하여 1000단위 표현값을 지정할 수 있습니다. 기본값은 콤마( , ) 입니다.</p>
<pre><code class="language-python">print(df.to_string(decimal=&#39;_&#39;))
&gt;&gt;
index col1       col2
0        1        NaN
1        A      4_179
2      &lt;&amp;&gt;  32000_000 # 1000단위 표현값이 .에서 _로 바
</code></pre>
<p><strong>line_width인수의 사용</strong></p>
<p><code>linde_width</code>인수값을 입력하여 줄바꿈할 열의 너비를 지정할 수 있습니다.</p>
<pre><code class="language-python">print(df.to_string(line_width=2))
&gt;&gt;
index col1  \ #줄바꿈이 진행되면서 \로 줄바꿈이 된걸 표현함
0        1
1        A
2      &lt;&amp;&gt;

index       col2   # 줄바꿈이 진행됨.
0            NaN
1          4.179
2      32000.000
</code></pre>
<p><strong>max_colwidth인수의 사용</strong></p>
<p><code>max_colwidth</code> 인수를 이용하여 열 내의 문자열 길이를 제한할 수 있습니다. 초과하는 문자는 ( ... ) 으로 함축됩니다.</p>
<pre><code class="language-python">print(df.to_string(max_colwidth=5))
&gt;&gt;
index col1  col2
0        1   NaN
1        A  4...
2      &lt;&amp;&gt;  3... # 길이 5이상을 함축함</code></pre>
<h1 id="numpy로-변환-values"><strong>numpy로 변환 (values)</strong></h1>
<pre><code class="language-python">col1 = [1, 2, 3, 4]
col2 = [&#39;one&#39;, &#39;two&#39;, &#39;three&#39;, &#39;four&#39;]
col3 = [1.5, 2.5, 3.5, 4.5]
col4 = [True, False, False, True]
index = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]
df = pd.DataFrame(index=index, data={&quot;col1&quot;: col1, &quot;col2&quot;: col2, &quot;col3&quot;: col3, &quot;col4&quot;: col4})
print(df)
&gt;&gt;
      col1   col2  col3   col4
row1     1    one   1.5   True
row2     2    two   2.5  False
row3     3  three   3.5  False
row4     4   four   4.5   True</code></pre>
<p>여기에 values함수를 적용할 경우 아래와 같은 결과가 반환됩니다</p>
<p>numpy.ndarray형태로</p>
<p>반환되며, 레이블이 사라진것을 확인할 수 있습니다.</p>
<h1 id="dict에서-변환-from_dict"><strong>dict에서 변환 (from_dict)</strong></h1>
<p><code>data</code> : dict 형태의 데이터 입니다.</p>
<p><code>orient</code> : {index / columns / tight} 변환 방식입니다. index은 행을 키값으로 지정, columns는 열을 키값으로 지정, tight는 키값으로 [index / columns / data / index_names / columns_names] 를 가집니다.</p>
<p><code>dtype</code> : 데이터의 type을 강제로 지정할 수 있습니다.</p>
<p><code>columns</code> : index인수를 사용할 경우 columns인수를 통해 열 이름을 지정할 수 있습니다.</p>
<pre><code class="language-python">Copydata = {&#39;col1&#39;:[1,3],&#39;col2&#39;:[2,4]}
df = pd.DataFrame.from_dict(data=data, orient=&#39;columns&#39;)
print(df)
&gt;&gt;
   col1  col2
0     1     2
1     3     4</code></pre>
<p><code>orient</code>인수의 기본값은 &#39;columns&#39;로 키값으로 열 이름을 사용하게 됩니다.</p>
<pre><code class="language-python">data = {&#39;col1&#39;:[1,3],&#39;col2&#39;:[2,4]}
df = pd.DataFrame.from_dict(data=data, orient=&#39;columns&#39;)
print(df)
&gt;&gt;
   col1  col2
0     1     2
1     3     4
</code></pre>
<p><code>orient</code>인수가 &#39;index&#39;인 경우 키 값으로 행 이름을 사용하게 됩니다.</p>
<pre><code class="language-python">data = {&#39;row1&#39;:[1,2],&#39;row2&#39;:[3,4]}
df = pd.DataFrame.from_dict(data=data, orient=&#39;index&#39;)
print(df)
&gt;&gt;
      0  1
row1  1  2
row2  3  4
</code></pre>
<p><code>orient</code>인수가 &#39;index&#39;인 경우 <code>columns</code>인수를 통해 열 이름을 추가로 설정할 수 있습니다.</p>
<pre><code class="language-python">data = {&#39;row1&#39;:[1,2],&#39;row2&#39;:[3,4]}
df = pd.DataFrame.from_dict(data=data, orient=&#39;index&#39;, columns=[&#39;col1&#39;,&#39;col2&#39;])
print(df)
&gt;&gt;
      col1  col2
row1     1     2
row2     3     4
</code></pre>
<p><code>dtype</code> 인수를 이용하면 값의 type을 강제로 지정할 수 있습니다.</p>
<pre><code class="language-python">data = {&#39;row1&#39;:[1,2],&#39;row2&#39;:[3,4]}
df = pd.DataFrame.from_dict(data=data, orient=&#39;index&#39;, columns=[&#39;col1&#39;,&#39;col2&#39;],dtype=&#39;float&#39;)
print(df)
&gt;&gt;
      col1  col2
row1   1.0   2.0
row2   3.0   4.0
# float type으로 변경된 것을 확인할 수 있습니다.
</code></pre>
<p><code>orient=&#39;tight&#39;</code>인 경우 &#39;index&#39; / &#39;columns&#39; / &#39;data&#39; / &#39;index_names&#39; / &#39;column_names&#39;를 키 값으로 지정하여 세부내용을 설정 할 수 있습니다.</p>
<p>※1.4.0 버전부터만 사용 가능합니다.</p>
<pre><code class="language-python">data =  {&#39;index&#39;        : [(&#39;idx1&#39;,&#39;row1&#39;),(&#39;idx1&#39;,&#39;row2&#39;)], # 인덱스 이름 설정, 멀티 인덱스 가능
         &#39;columns&#39;      : [(&#39;col1&#39;,&#39;val1&#39;),(&#39;col2&#39;,&#39;val2&#39;)], # 열 이름 설정, 멀티 컬럼 가능
         &#39;data&#39;         : [[1,2],[3,4]], # 데이터 값 설정
         &#39;index_names&#39;  : [&#39;I1&#39;,&#39;I2&#39;], # 인덱스명 설정
         &#39;column_names&#39; : [&#39;C1&#39;,&#39;C2&#39;]} # 컬럼명 설정
df = pd.DataFrame.from_dict(data=data, orient=&#39;tight&#39;)
print(df)
&gt;&gt;
C1        col1 col2
C2        val1 val2
I1   I2
idx1 row1    1    2
     row2    3    4</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-05-13]]></title>
            <link>https://velog.io/@smile_07/2025-05-13</link>
            <guid>https://velog.io/@smile_07/2025-05-13</guid>
            <pubDate>Tue, 13 May 2025 11:26:05 GMT</pubDate>
            <description><![CDATA[<h1 id="열-인덱스-반복자-반환-iter"><strong>열 인덱스 반복자 반환 (<strong>iter</strong>)</strong></h1>
<pre><code class="language-python">data = {&#39;col1&#39;:[1,2],&#39;col2&#39;:[3,4]}
df = pd.DataFrame(data = data)
print(df)
&gt;&gt;
   col1  col2
0     1     3
1     2     4
</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p>기본적으로 <code>df.__iter__( )</code> 형태로 사용하며, 열 인덱스의 <code>map 오브젝트</code>를 반환합니다.</p>
<pre><code class="language-python">df2 = df.__iter__()
print(df2)
&gt;&gt;
&lt;map object at 0x000001CAFD121D00&gt;
</code></pre>
<p><code>map 오브젝트</code>는 <code>range</code>함수처럼 하나씩 꺼내서 쓰는형태이기 때문에 단순 print로는 출력이 불가합니다.</p>
<p>반복자 (iterator)이기 때문에 <code>next</code> 메서드를 통해 하나씩 확인할 수 있습니다.</p>
<pre><code class="language-python">print(next(df2))
&gt;&gt;
col1

print(next(df2))
&gt;&gt;
col2
</code></pre>
<p><code>list</code> 메서드를 이용하면 리스트 형태로 반환이 가능합니다.</p>
<pre><code class="language-python">print(list(df))
&gt;&gt;
[&#39;col1&#39;, &#39;col2&#39;]</code></pre>
<h1 id="열과-내용의-반복자-반환-items-iteritems"><strong>열과 내용의 반복자 반환 (items, iteritems)</strong></h1>
<pre><code class="language-python">data = {&#39;col1&#39;:[1,2],&#39;col2&#39;:[3,4]}
idx = [&#39;row1&#39;,&#39;row2&#39;]
df = pd.DataFrame(data = data, index=idx)
print(df)
&gt;&gt;
      col1  col2
row1     1     3
row2     2     4
</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p>기본적으로 <code>df.items()</code> 형태로 사용하며, 출력 시 <code>generator</code> 객체인 것을 확인 할 수 있습니다.</p>
<pre><code class="language-python">df2 = df.items()
print(df2)
&gt;&gt;
&lt;generator object DataFrame.items at 0x000001E83178D430&gt;
</code></pre>
<p><code>generator</code> 역시 iterator(반복자) 로 <code>for문</code>이나 <code>list</code>로 내용을 확인 할 수 있습니다.</p>
<pre><code class="language-python">df2 = df.items()
for iin df2:
    print(&quot;=&quot;*10)
    print(i)
&gt;&gt;
==========
(&#39;col1&#39;, row1    1
row2    2
Name: col1, dtype: int64)
==========
(&#39;col2&#39;, row1    3
row2    4
Name: col2, dtype: int64)

# 튜플 형태로 (열이름, 내용의 Series객체)출력됨
</code></pre>
<p><code>for문</code>을 한번 더 사용해서 튜플의 내용을 한 줄마다 출력하면 보다 더 직관적으로 확인할 수 있습니다.</p>
<pre><code class="language-python">df2 = df.items()
for iin df2:
    print(&quot;=&quot;*30)
for jin i:
        print(j)
&gt;&gt;
==========
col1
row1    1
row2    2
Name: col1, dtype: int64
==========
col2
row1    3
row2    4
Name: col2, dtype: int64</code></pre>
<h1 id="행과-내용의-반복자-반환-iterrows"><strong>행과 내용의 반복자 반환 (iterrows)</strong></h1>
<pre><code class="language-python">data = {&#39;col1&#39;:[1,2],&#39;col2&#39;:[3,4]}
idx = [&#39;row1&#39;,&#39;row2&#39;]
df = pd.DataFrame(data = data, index=idx)
print(df)
&gt;&gt;
      col1  col2
row1     1     3
row2     2     4
</code></pre>
<h2 id=""></h2>
<p><strong>기본적인 사용법</strong></p>
<p>기본적으로 <code>df.iterrows()</code> 형태로 사용하며, 출력 시 <code>generator</code> 객체인 것을 확인 할 수 있습니다.</p>
<pre><code class="language-python">df2 = df.iterrows()
print(df2)
&gt;&gt;
&lt;generator object DataFrame.iterrows at 0x0000027666A4C430&gt;
</code></pre>
<p><code>generator</code> 역시 iterator(반복자) 로 <code>for문</code>이나 <code>list</code>로 내용을 확인 할 수 있습니다.</p>
<pre><code class="language-python">df2 = df.iterrows()
for iin df2:
    print(&quot;=&quot;*30)
    print(i)
&gt;&gt;
==============================
(&#39;row1&#39;, col1    1
col2    3
Name: row1, dtype: int64)
==============================
(&#39;row2&#39;, col1    2
col2    4
Name: row2, dtype: int64)
</code></pre>
<p><code>for문</code>을 한번 더 사용해서 튜플의 내용을 한 줄마다 출력하면 보다 더 직관적으로 확인할 수 있습니다.</p>
<pre><code class="language-python">Copydf2 = df.iterrows()
for iin df2:
    print(&quot;=&quot; * 30)
for jin i:
        print(j)
&gt;&gt;
==============================
row1
col1    1
col2    3
Name: row1, dtype: int64
==============================
row2
col1    2
col2    4
Name: row2, dtype: int64</code></pre>
<h1 id="튜플형태-반복자-반환itertuples">튜플형태 반복자 반환(itertuples)</h1>
<pre><code class="language-python">print(df.itertuples())
&gt;&gt;
&lt;map object at 0x0000027D368BCE80&gt;
</code></pre>
<p><code>list</code>를 이용해 출력해보면, 구성이 튜플(인덱스, 열=값, 열=값...) 형태인 것을 확인할 수 있습니다.</p>
<pre><code class="language-python">print(list(df.itertuples()))
&gt;&gt;
[Pandas(Index=&#39;row1&#39;, col1=1, col2=3), Pandas(Index=&#39;row2&#39;, col1=2, col2=4)]
</code></pre>
<p><strong>index인수의 사용</strong></p>
<p><code>index=False</code>로 입력할 경우 반환되는 튜플값에서 인덱스 정보가 제외됩니다.</p>
<pre><code class="language-python">print(list(df.itertuples(index=False)))
&gt;&gt;
[Pandas(col1=1, col2=3), Pandas(col1=2, col2=4)]
</code></pre>
<p><strong>name인수의 사용</strong></p>
<p><code>name</code>인수를 지정해주면, 튜플이 <code>namedtuple</code> 형태로 반환됩니다. 기본값은 <code>Pandas</code>이며 <code>None</code> 입력시 일반 튜플로 반환합니다.</p>
<pre><code class="language-python">print(list(df.itertuples(name=None)))#기본
&gt;&gt;
[(&#39;row1&#39;, 1, 3), (&#39;row2&#39;, 2, 4)] #일반 튜플로 반환
</code></pre>
<pre><code class="language-python">print(list(df.itertuples(name=&quot;테스트&quot;)))
&gt;&gt;
[테스트(Index=&#39;row1&#39;, col1=1, col2=3), 테스트(Index=&#39;row2&#39;, col1=2, col2=4)] # 지정된 name으로 namedtuple 반환</code></pre>
<h1 id="csv으로-변환-to_csv">csv으로 변환 (to_csv)</h1>
<p><code>path_or_buf</code> : csv파일이 생성되는 경로와 파일명 입니다.</p>
<p><code>sep</code> : csv 파일의 구분자 입니다. 기본값은 &#39; , &#39; 입니다.</p>
<p><code>na_rep</code> : 결측값을 어떻게 출력할지 지정할 수 있습니다. 기본값은 공백 입니다.</p>
<p><code>float_format</code> : 부동소수점의 경우 어떤 형식으로 출력할지 지정할 수 있습니다.</p>
<p><code>columns</code> : 출력할 열을 지정하는 인수 입니다.</p>
<p><code>header</code> : 열 이름을 설정합니다. False일 경우 열 이름을 출력하지 않습니다.</p>
<p><code>index</code> : 인덱스의 출력 여부 입니다. False일 경우 인덱스를 출력하지 않습니다.</p>
<p><code>index_label</code> : 인덱스의 레이블(인덱스명)을 설정합니다.</p>
<p><code>mode</code> : {&#39;w&#39; / &#39;a&#39;} 쓰기 모드를 지정합니다. <code>a</code>로 지정할 경우 기존 파일 아래에 값을 추가하여 입력하게됩니다.</p>
<p><code>encoding</code> : 인코딩 설정입니다. 기본값은 <code>utf-8</code>입니다.</p>
<p><code>compression</code> : {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None} 압축 설정을 지정합니다. 기본값은 &#39;infer&#39;로 적절한 압축형식을 추론합니다.</p>
<p><code>quoting</code> : 값에 대해서 인용구 설정을 할 수 있습니다. 어떤 값에 대해서 인용구를 설정할지는 아래와 같습니다.</p>
<p>{0 : MINIMAL 문자와 특수문자 / 1 : ALL 모든필드 / 2 : NONNUMERIC 숫자가 아닌것 / 3 : NONE 안함}</p>
<p><code>quotechar</code> : quoting에서 지정한 인용구에 대해서 인용구에 사용할 문자를 지정합니다. 기본값은 쌍따옴표 입니다.</p>
<p><code>chunksize</code> : 한번에 불러올 행의 수를 지정합니다. 예를들어 100을 입력할 경우 한번에 100행씩 변환합니다. 속도 향상에 기여합니다.</p>
<p><code>date_format</code> : 값이 시계열(datetime) 데이터인 경우 그 값의 포맷을 지정합니다.(예 : &#39;%Y-%m&#39;)</p>
<p><code>doublequoto</code> : 값중에 quotechar과 같은 값이 있을때, 그 값을 인용구 처리할지의 여부 입니다.</p>
<p><code>escapechar</code> : doublequoto=False인 경우 인용구와 중복되는 그 값을 어떤 값으로 변경할지 여부입니다.</p>
<p><code>decimal</code> : 자리수로 쓰이는 문자를 지정합니다.즉, <code>100,000</code>의 경우 decimal=&quot;.&quot;으로 할 경우<code>100.000</code>으로 표시합니다.</p>
<p><code>errors</code> : 인코딩 오류에 대해서 오류 처리를 정할 수 있습니다. 가능한 값은 아래와 같습니다.</p>
<p>{strict : 인코딩 오류에 ValueError 발생 / ignore : 무시 / replace 잘못된 데이터를 대체마커 &#39;?&#39; 지정 / ...}</p>
<p>더 많은 값에 대해서는 <a href="https://docs.python.org/3/library/functions.html#strict">python library 의 strict 문서</a> 참고 바랍니다.</p>
<p><code>storage_options</code> : 특정 스토리지 연결에 적합한 추가 옵션, 예: 호스트, 포트, 사용자 이름, 비밀번호 등을 지정합니다.</p>
<p>CSV는 &quot;Comma-Separated Values&quot;의 약자로, <strong>쉼표로 구분된 값들</strong>이라는 뜻입니다.
CSV 파일은 <strong>엑셀처럼 표 형태의 데이터를 저장하는 텍스트 파일</strong>입니다. 각 줄은 하나의 행(row)을 나타내고, 쉼표(,)로 나뉜 각 값은 열(column)을 나타냅니다.</p>
<p>먼저 기본적인 사용법 예시를위하여 3x2 짜리 데이터를 만들어 보겠습니다.</p>
<pre><code class="language-python">data = [[1,np.NaN],[&#39;A&#39;,4.1],[&#39;-&#39;,&#39;3&#39;]]
df = pd.DataFrame(data)
#address = &#39;C:\\Users\\lifcr\\OneDrive\\바탕 화면\\pandas\\&#39; #기본 경로 설정해줌(코딩이 길어지므로) colab에서 실행하면 굳아 지정해줄 필요가 없음
&gt;&gt;
   0    1
0  1  NaN # 결측치 NaN 포함
1  A  4.1 # 문자 A, 부동소수점 4.1 포함
2  -    3 # 문자 - 포함</code></pre>
<p>기본적으로 <code>path_or_buf</code>에 경로와 파일 이름을 지정해주면, 해당 경로에 df가 변환된 csv파일이 생성됩니다.</p>
<pre><code class="language-python">df.to_csv(path_or_buf=&#39;test1.csv&#39;)</code></pre>
<p><img src="attachment:bccfbb72-a98b-44ff-8c95-4f53a722b6bb:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-13_191427.png" alt="스크린샷 2025-05-13 191427.png"></p>
<p><code>sep</code> 인수는 csv파일의 구분자를 설정해 줍니다. 기본값은 쉼표(,)입니다.</p>
<pre><code class="language-python">Copydf.to_csv(path_or_buf=address+&#39;test2.csv&#39;, sep=&#39;-&#39;)#쉼표들을 -로 대체해줍니다

&gt;&gt;
-0-1
0-1-
1-A-4.1
2-&quot;-&quot;-3
=
         -0-1#col
row 0-1-nan
        1-A-4.1
        2-&quot;-&quot;-3</code></pre>
<p><img src="attachment:ec00eaa2-6eb1-4df8-bd82-1c6373eddeda:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-13_192617.png" alt="스크린샷 2025-05-13 192617.png"></p>
<p><code>na_rep</code>인수는 데이터의 결측값(NaN)을 어떤 값으로 출력할지를 지정할 수 있습니다.</p>
<pre><code class="language-python">df.to_csv(path_or_buf=&#39;test3.csv&#39;, na_rep=100)#결측값을 100으로 지정해서 출력함

&gt;&gt;
,0,1
0,1,100
1,A,4.1
2,-,3</code></pre>
<p><img src="attachment:03d932d9-0c9f-45c6-a8e6-cd9d54a91b97:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-13_193028.png" alt="스크린샷 2025-05-13 193028.png"></p>
<p><code>float_format</code>인수는 부동소수점 형식 데이터의 출력 포맷을 설정할 수 있습니다.</p>
<p>만약 값으로 그냥 string 형태의 값을 입력할 경우 해당 값이 출력됩니다.</p>
<pre><code class="language-python">df.to_csv(path_or_buf=&#39;test4.csv&#39;, float_format=&#39;%.2f&#39;)
,0,1
0,1,
1,A,4.1 #원래 4.10이 출력되어야 하는데 소수점0이라서 그냥 무시하는거 같음
2,-,3
</code></pre>
<p><img src="attachment:7082e7c9-0a3d-4cbb-a4e1-b60c2cf08078:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-13_193413.png" alt="스크린샷 2025-05-13 193413.png"></p>
<p><code>columns</code>인수는 출력할 대상 열을 지정하는 인수입니다. 따로 입력하지 않는경우 모든 열이 csv변환 됩니다.</p>
<pre><code class="language-python">df.to_csv(path_or_buf=&#39;test5.csv&#39;, columns=[0])#열의 0번째만 출력함
&gt;&gt;
,0
0,1
1,A
2,-
</code></pre>
<p><code>header</code>인수는 열의 이름을 지정하는 인수입니다. False일 경우 열 이름을 출력하지 않습니다.</p>
<pre><code class="language-python">df.to_csv(path_or_buf=&#39;test6.csv&#39;, header=[&#39;col1&#39;,&#39;col2&#39;])#머리값을 추가해준다
&gt;&gt;

,col1,col2
0,1,
1,A,4.1
2,-,3
</code></pre>
<p><img src="attachment:037549f8-4731-4178-a5ec-35cf7f4452cc:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-13_194206.png" alt="스크린샷 2025-05-13 194206.png"></p>
<p><code>index</code>인수는 인덱스의 출력 여부를 지정할 수 있습니다. 기본값은 <code>True</code> 입니다.</p>
<pre><code class="language-python">df.to_csv(path_or_buf=&#39;test7.csv&#39;, index=False)
&gt;&gt;
0,1
1,
A,4.1
-,3
</code></pre>
<p><code>index_lable</code>인수는 출력되는 csv파일의 인덱스명을 지정하는 인수 입니다.</p>
<pre><code class="language-python">df.to_csv(path_or_buf=&#39;test8.csv&#39;, index_label=[&#39;index&#39;])#인덱스명 지정함수
&gt;&gt;
index,0,1
0,1,
1,A,4.1
2,-,3
</code></pre>
<p><strong>mode 인수의 사용</strong></p>
<p><code>mode</code> 인수는 기본값이 <code>w</code>로 기존 데이터에 새 데이터를 덮어씌웁니다. <code>mode=&#39;a&#39;</code>인 경우 기존 데이터 아래에 새 데이터를 추가해서 입력합니다.</p>
<pre><code class="language-python">df.to_csv(path_or_buf=address+&#39;test9.csv&#39;, mode=&#39;w&#39;) #기존 데이터 csv파일생성
df2 = pd.DataFrame(data=[[7,8],[9,10]],index=[3,4]) # 추가 입력할 새 데이터 객체 생성
df2.to_csv(path_or_buf=address+&#39;test9.csv&#39;, mode=&#39;a&#39;) # mode=a로 기존데이터 아래에 추가함
</code></pre>
<p>결과는 아래와 같습니다. 기존 데이터 아래에 새 데이터가 추가된것을 확인할 수 있습니다.</p>
<p><img src="https://wikidocs.net/images/page/159465/09.jpg" alt=""></p>
<p>이렇게 단순히 추가하는경우 열 이름이 새로 추가되기 때문에, 보기에 깔끔하지 않습니다. 이경우 <code>header=False</code>하여 새로 추가하는 데이터의 열 이름을 삭제해서 깔끔하게 합치는것이 가능합니다.</p>
<pre><code class="language-python">df.to_csv(path_or_buf=address+&#39;test10.csv&#39;, mode=&#39;w&#39;)
df2.to_csv(path_or_buf=address+&#39;test10.csv&#39;, mode=&#39;a&#39;,header=False)
</code></pre>
<p>결과는 아래와 같습니다. header=False로 열 이름이 삭제되어 깔끔하게 합쳐진것을 확인할 수 있습니다.</p>
<h1 id="excel로-변환-to_excel">excel로 변환 (to_excel)</h1>
<p><code>excel_writer</code> : 경로와 파일 이름을 설정하거나 <code>ExcelWriter</code> 객체를 지정합니다.</p>
<p><code>sheet_name</code> : 시트 이름을 설정해줍니다. 중복인 경우 덮어씌워집니다.</p>
<p><code>na_rep</code> : 결측치를 대체할 값을 설정합니다. 기본값은 공백(&quot; &quot;) 입니다.</p>
<p><code>float_format</code> : 부동소수점의 표현방식을 지정합니다.</p>
<p><code>columns</code> : 엑셀로 변환할 열을 지정합니다.</p>
<p><code>header</code> : 열 이름을 설정합니다. <code>None</code>인 경우에는 열이름을 출력하지 않습니다.</p>
<p><code>index</code> : index의 출력 여부를 정합니다.</p>
<p><code>index_label</code> : index명을 지정합니다. Multi Index의 경우 리스트 형식으로 지정해주어야합니다.</p>
<p><code>startrow / startcol</code> : 값이 입력되는 위치를 지정합니다.</p>
<p><code>engine</code> : 사용할 엔진을 지정합니다. &#39;openpyxl&#39; 또는 &#39;xlsxwriter&#39;. io.excel.xlsx.writer, io.excel.xls.writer 및 io.excel.xlsm.writer 옵션을 통해 이를 설정할 수도 있습니다. <code>merge_cells</code> : Index가 중복인 경우 엑셀로 변환시 병합할지 정합니다. 기본값은 True로 병합이 됩니다.</p>
<p><code>encoding</code> : 결과 엑셀파일의 인코딩을 지정합니다. xlwt에만 필요하며 다른 경우는 기본 유니코드를 지원합니다.</p>
<p><code>inf_rep</code> : 엑셀은 기본적으로 무한에대한 표시형식이 없기때문에, 무한인 값을 어떻게 표시할지 정합니다. 기본값은 &#39;inf&#39; 입니다.</p>
<p><code>vervose</code> : 오류 로그에 추가 정보를 표시할지 여부입니다. 기본값은 True입니다.</p>
<p><code>freeze_panes</code> : 틀고정을 지정합니다. 튜플로 (값, 값) 형태로 지정합니다.</p>
<p><code>storage_options</code> : 특정 스토리지 연결에 적합한 추가 옵션을 지정합니다. (예 : 호스트, 포트, 사용자 이름, 비밀번호 등)</p>
<p>먼저 기본적인 사용법 예시를위하여 3x2 데이터 하나와 Multi Index 데이터 하나를 만들어 보겠습니다.</p>
<pre><code class="language-python">Copydata1 = [[1,np.nan],[&#39;A&#39;,4.1],[math.inf,&#39;3&#39;]]
df1 = pd.DataFrame(data)
df2 = pd.DataFrame(data=[[5,6],[7,8],[9,10]],index=[[&#39;A&#39;,&#39;B&#39;,&#39;B&#39;],[3,4,5]]) #멀티인덱스 객체
print(df1)
print(df2)

&gt;&gt;
   0    1
0  1  NaN
1  A  4.1
2  -    3
     0   1
A 3  5   6
B 4  7   8
  5  9  10</code></pre>
<p>기본적으로는 <code>excel_writer</code>에 단순히 경로를 지정하는것 만으로 엑셀로의 변환이 실행됩니다.</p>
<pre><code class="language-python">Copydf1.to_excel(excel_writer=&#39;test1.xlsx&#39;)

&gt;&gt;
    0    1    
0    1        
1    A    4.1    
2    -    3    
</code></pre>
<p><img src="attachment:88b29679-c6a1-46bf-aff0-ec180deeaeed:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-13_195204.png" alt="스크린샷 2025-05-13 195204.png"></p>
<p><code>sheet_name</code>인수를 통해 데이터가 변환되는 엑셀의 시트명을 지정할 수 있습니다.</p>
<pre><code class="language-python">Copydf1.to_excel(excel_writer=&#39;test2.xlsx&#39;,sheet_name=&#39;test_sheet&#39;)#sheet_name으로 시트명을 지정할 수 있다</code></pre>
<p><img src="attachment:e6277573-8560-4c7c-8770-cadac8370eb8:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-13_195603.png" alt="스크린샷 2025-05-13 195603.png"></p>
<p>여러 시트에 데이터를 적용하고자 할 경우 <code>ExcelWriter</code> 객체로 writer를 지정해 입력하면 됩니다.</p>
<pre><code class="language-python">with pd.ExcelWriter(&#39;test3.xlsx&#39;)as writer:
    df1.to_excel(writer, sheet_name=&#39;test_sheet_1&#39;)
    df2.to_excel(writer, sheet_name=&#39;test_sheet_2&#39;)</code></pre>
<p><img src="attachment:59888fc0-12af-4666-89e2-9149f333a4fd:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-13_195815.png" alt="스크린샷 2025-05-13 195815.png"></p>
<p><code>na_rep</code> 인수를 통해 결측치를 대체할 값을 지정할 수 있습니다. 기본값은 공백(&quot; &quot;)입니다.</p>
<pre><code class="language-python">df1.to_excel(excel_writer=&#39;test4.xlsx&#39;,na_rep=&#39;BLANK&#39;)#na_rep= 함수로 결측치값을 대체할 수 있다</code></pre>
<p><img src="attachment:191532f1-4ada-4231-b7f9-d44ed7a7cfce:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-13_195945.png" alt="스크린샷 2025-05-13 195945.png"></p>
<p><code>columns</code>인수를 통해 변환할 열을 따로 지정할 수 있습니다.</p>
<pre><code class="language-python">df1.to_excel(excel_writer=&#39;test6.xlsx&#39;,columns=[0])#열지정 csv와 파일형식만 다르지 출력은 같다</code></pre>
<p><code>header</code>인수를 통해 변환될 데이터의 열 이름을 지정할 수 있습니다.</p>
<pre><code class="language-python">df1.to_excel(excel_writer=&#39;test7.xlsx&#39;,header=[&#39;col1&#39;,&#39;col2&#39;])#열 이름 지정 csv와 파일형식만 다르지 출력은 같다</code></pre>
<p><code>Index</code> 인수를 통해 인덱스를 출력할지 여부를 지정할 수 있습니다. 기본값은 True로 인덱스를 출력합니다.</p>
<pre><code class="language-python">df1.to_excel(excel_writer=&#39;test8.xlsx&#39;, index=False)#인덱스 출력 여부 csv와 파일형식만 다르지 출력은 같다</code></pre>
<p><code>Index_label</code> 인수를 통해 인덱스명을 지정할 수 있습니다. Multi Index라면 리스트 형식으로 입력해주어야합니다.</p>
<pre><code class="language-python">df2.to_excel(excel_writer=&#39;test9.xlsx&#39;, index_label=[&#39;idx1&#39;,&#39;idx2&#39;])#멀티인덱스이기 때문에 리스트 형식으로 입력했다 index_label은 인덱스 명을 지정해 준다</code></pre>
<p><img src="attachment:40d5ac24-c647-47c5-bf56-a87260248ada:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-13_200547.png" alt="스크린샷 2025-05-13 200547.png"></p>
<p><code>startrow / startcol</code> 인수는 엑셀 변환시 데이터의 위치를 지정하는 인수입니다. 양수를 입력할 경우 처음 시작위치에서 행의 경우 아래로, 열의 경우 우측으로 해당 숫자만큼 이동하여 변환됩니다.</p>
<pre><code class="language-python">df1.to_excel(excel_writer=&#39;test10.xlsx&#39;, startrow=2,startcol=4)#2행 4열 우측으로 움직였다</code></pre>
<p><img src="attachment:e314913a-0e1c-4405-b6a1-c97c655a55aa:%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2025-05-13_200910.png" alt="스크린샷 2025-05-13 200910.png"></p>
<p><code>merge_cells</code>의 기본값은 True로 인덱스에 중복값이 있을 경우 병합하여 출력합니다.</p>
<p>False인 경우 각각 인덱스가 그대로 출력됩니다.</p>
<p><code>merge_cells=True</code>인 경우</p>
<pre><code class="language-python">df2.to_excel(excel_writer=adress+&#39;test11_1.xlsx&#39;)#중복값인 B가 병합하여 하나만 출력함
</code></pre>
<p><img src="https://wikidocs.net/images/page/159484/11_1.png" alt=""></p>
<p><code>merge_cells=False</code>인 경우</p>
<pre><code class="language-python">df2.to_excel(excel_writer=adress+&#39;test11_2.xlsx&#39;, merge_cells=False)# 정상출력
</code></pre>
<p><img src="https://wikidocs.net/images/page/159484/11_2.png" alt=""></p>
<p><strong>inf_rep 인수의 사용</strong></p>
<p><code>inf_rep</code> 인수는 무한 값의 엑셀 변화시 표현값을 지정합니다. 기본값은 <code>inf</code>입니다. (엑셀에는 무한값에 대한 기본 표현값이 없습니다.)</p>
<pre><code class="language-python">df1.to_excel(excel_writer=adress+&#39;test12.xlsx&#39;, inf_rep=&#39;∞&#39;)
</code></pre>
<p>아래와 같이 무한을 표현하는 <code>math.inf</code> 값이 문자 <code>∞</code> 로 입력된 것을 알 수 있습니다.</p>
<p><img src="https://wikidocs.net/images/page/159484/12.png" alt=""></p>
<p><strong>freeze_panes인수의 사용</strong></p>
<p><code>freeze_panes</code>인수의 값을 튜플로 입력함으로써 해당 (행,열) 기준으로 틀고정을 설정할 수 있습니다.</p>
<pre><code class="language-python">df1.to_excel(excel_writer=adress+&#39;test13.xlsx&#39;, freeze_panes=(1,1))
</code></pre>
<p>아래와 같이 (1,1)을 기준으로 틀고정이 된 것을 확인할 수 있습니다.</p>
<p><img src="https://wikidocs.net/images/page/159484/13.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-05-12]]></title>
            <link>https://velog.io/@smile_07/2025-05-12</link>
            <guid>https://velog.io/@smile_07/2025-05-12</guid>
            <pubDate>Mon, 12 May 2025 10:45:23 GMT</pubDate>
            <description><![CDATA[<h1 id="기간데이터-쉬프트-shift"><strong>기간/데이터 쉬프트 (shift)</strong></h1>
<p><code>shift</code>메서드는 시계열 데이터의 데이터나 인덱스를 원하는 기간만큼 쉬프트 하는 메서드 입니다.</p>
<p><code>freq</code> 인수를 입력하지 않으면 데이터가 이동하고, 인수값을 입력하게되면 인덱스가 <code>freq</code>값 만큼 이동하게됩니다.</p>
<p><code>periods</code> : 이동할 기간입니다.</p>
<p><code>freq</code> : 입력 할 경우 인덱스가 이동하게 됩니다. <code>Y, M, D, H, T, S</code> 나 Timestamp, &#39;Infer&#39;등이 올 수 있습니다.</p>
<p><code>fill_value</code> : shift로 인해 생긴 결측치를 대체할 값입니다.</p>
<p>먼저 기본적인 사용법 예시를위하여 5x3 짜리 데이터를 만들어보겠습니다.</p>
<p><code>pd.date_range</code>를 이용해 기준시간에 대해 일정 간격을 가진 datetime index를 생성하겠습니다.</p>
<pre><code class="language-python">idx = pd.date_range(start=&#39;2022-01-01&#39;,periods=5,freq=&#39;2D&#39;)
# 2일 간격으로 5행의 인덱스 생성
data={&#39;col1&#39;:[10,20,30,40,50],&#39;col2&#39;:[1,3,6,7,9],&#39;col3&#39;:[43,13,82,47,31]}
df = pd.DataFrame(data=data, index=idx)
print(df)
&gt;&gt;
            col1  col2  col3
2022-01-01    10     1    43
2022-01-03    20     3    13
2022-01-05    30     6    82
2022-01-07    40     7    47
2022-01-09    50     9    31
</code></pre>
<p>period 인수 사용할 경우 행 기준으로 이동</p>
<pre><code class="language-python">print(df.shift(periods=2,))
&gt;&gt;
            col1  col2  col3
2022-01-01   NaN   NaN   NaN
2022-01-03   NaN   NaN   NaN
2022-01-05  10.0   1.0  43.0
2022-01-07  20.0   3.0  13.0
2022-01-09  30.0   6.0  82.0</code></pre>
<p>axis  사용</p>
<pre><code class="language-python">print(df.shift(periods=2,axis=1))
&gt;&gt;
            col1  col2  col3
2022-01-01   NaN   NaN    10
2022-01-03   NaN   NaN    20
2022-01-05   NaN   NaN    30
2022-01-07   NaN   NaN    40
2022-01-09   NaN   NaN    50</code></pre>
<p><code>fill_value</code> 인수를 사용하면, shift되면서 <code>NaN</code>처리된 결측치를 원하는 값으로 채울 수 있습니다.</p>
<pre><code class="language-python">print(df.shift(periods=2, axis=1,fill_value=&#39;-&#39;))
&gt;&gt;
           col1 col2 col3
2022-01-01    -    -   10
2022-01-03    -    -   20
2022-01-05    -    -   30
2022-01-07    -    -   40
2022-01-09    -    -   50
</code></pre>
<p><strong>freq 인수의 사용</strong></p>
<p><code>freq</code> 인수를 설정해주면, 데이터가 아닌 인덱스가 <code>freq</code>에 입력한 값 만큼 쉬프트 됩니다.</p>
<pre><code class="language-python">print(df.shift(periods=3,freq=&#39;D&#39;))
# 일 기준 3기간 이동. 즉, 3일 이동
&gt;&gt;
#인덱스에 있는 년도와 날짜가 3일씩 이동된걸 알 수 있다
            col1  col2  col3
2022-01-04    10     1    43
2022-01-06    20     3    13
2022-01-08    30     6    82
2022-01-10    40     7    47
2022-01-12    50     9    31
</code></pre>
<p><code>freq=&#39;infer&#39;</code>인 경우, 현재 인덱스의 간격을 분석해서 적당한 <code>freq</code>를 추론해줍니다.</p>
<pre><code class="language-python">print(df.shift(periods=3,freq=&#39;infer&#39;))
#인덱스의 날짜 간격이 처음 데이터프레임을 생성할때 2D라는 간격으로 설정했기 때문에 
#infer로 추론한 간격은 2D가 된다
&gt;&gt;
            col1  col2  col3
2022-01-07    10     1    43
2022-01-09    20     3    13
2022-01-11    30     6    82
2022-01-13    40     7    47
2022-01-15    50     9    31
</code></pre>
<p>위의 예시의 경우, 인덱스의 인터벌(간격)이 2일이므로 <code>freq=&#39;2D&#39;</code>로 추론하였으며, <code>period=3</code>이기 때문에 6일이 쉬프트 된것을 알 수 있습니다.</p>
<h1 id="period로-변환-to_period"><strong>period로 변환 (to_period)</strong></h1>
<p>DatetimeIndex와 PeriodIndex의 차이는 Datetimeindex는 연,월,일과 같은 모든 시간을 표시하지만 Periodindex는 그중에서 잘라서 출력해 줄 수 있</p>
<p><code>to_period</code> 메서드는 DatetimeIndex를 PeriodIndex로 변환하는 메서드 입니다.</p>
<p><code>freq</code> : 원하는 시간 단위로 변환할 수 있습니다.</p>
<p><code>axis</code> : 변환할 기준 축 입니다.</p>
<p><code>copy</code> : 사본을 형성할지 여부입니다.</p>
<pre><code class="language-python">idx = pd.date_range(start=&#39;2021-08-01&#39;,periods=5,freq=&#39;45D&#39;) # 45일 간격 인덱스
&gt;&gt;
DatetimeIndex([&#39;2021-08-01&#39;, &#39;2021-09-15&#39;, &#39;2021-10-30&#39;, &#39;2021-12-14&#39;,
               &#39;2022-01-28&#39;],
              dtype=&#39;datetime64[ns]&#39;, freq=&#39;45D&#39;) # 형식은 datetime64
</code></pre>
<p><code>freq</code>값을 지정하여 원하는 시간간격으로 출력이 가능합니다.</p>
<p><code>freq=&quot;Y&quot;</code></p>
<pre><code class="language-python">print(idx.to_period(&quot;Y&quot;))
&gt;&gt;
PeriodIndex([&#39;2021&#39;, &#39;2021&#39;, &#39;2021&#39;, &#39;2021&#39;, &#39;2022&#39;], dtype=&#39;period[A-DEC]&#39;)
</code></pre>
<p><code>freq=&quot;M&quot;</code></p>
<pre><code class="language-python">print(idx.to_period(&quot;M&quot;))
&gt;&gt;
PeriodIndex([&#39;2021-08&#39;, &#39;2021-09&#39;, &#39;2021-10&#39;, &#39;2021-12&#39;, &#39;2022-01&#39;], dtype=&#39;period[M]&#39;)
</code></pre>
<p><code>freq=&quot;W&quot;</code></p>
<pre><code class="language-python">print(idx.to_period(&quot;W&quot;))
&gt;&gt;
PeriodIndex([&#39;2021-07-26/2021-08-01&#39;, &#39;2021-09-13/2021-09-19&#39;,
             &#39;2021-10-25/2021-10-31&#39;, &#39;2021-12-13/2021-12-19&#39;,
             &#39;2022-01-24/2022-01-30&#39;],
            dtype=&#39;period[W-SUN]&#39;)
</code></pre>
<p><code>freq=&quot;H&quot;</code></p>
<pre><code class="language-python">print(idx.to_period(&quot;H&quot;))
&gt;&gt;
PeriodIndex([&#39;2021-08-01 00:00&#39;, &#39;2021-09-15 00:00&#39;, &#39;2021-10-30 00:00&#39;,
             &#39;2021-12-14 00:00&#39;, &#39;2022-01-28 00:00&#39;],
            dtype=&#39;period[H]&#39;)</code></pre>
<h1 id="하위분류반환-xs"><strong>하위분류반환 (xs)</strong></h1>
<p><code>xs</code>는 멀티인덱스 객체에 대해서 하위 분류를 출력하는 메서드입니다.</p>
<p><code>key</code> : 분류의 기준이 되는 값입니다. Multi Index의 값을 지정합니다.</p>
<p><code>axis</code> : 하위 분류 출력의 기준이되는 축을 지정합니다.</p>
<p><code>level</code> : 멀티인덱스에 키가 부분적으로 포함되어있는경우, 레벨 지정을 통해 분류할 수 있습니다.</p>
<p><code>drop_level</code> : 기본값은 True로 필터링하는 값을 제외하고 하위 분류만 출력합니다. False면 필터링하는 값이 있는 분류까지 출력합니다.</p>
<pre><code class="language-python">data = {&#39;col1&#39;:[0,1,2,3,4], &#39;col2&#39;:[5,6,7,8,9],
        &#39;level0&#39;:[&#39;A&#39;,&#39;A&#39;,&#39;A&#39;,&#39;B&#39;,&#39;B&#39;],
        &#39;level1&#39;:[&#39;X&#39;,&#39;X&#39;,&#39;Y&#39;,&#39;Y&#39;,&#39;Z&#39;],
        &#39;level2&#39;:[&#39;a&#39;,&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;a&#39;]}
df = pd.DataFrame(data=data)
df = df.set_index([&#39;level0&#39;, &#39;level1&#39;, &#39;level2&#39;])
print(df)
&gt;&gt;
                      col1  col2
level0 level1 level2
A      X      a          0     5
              a          1     6
       Y      b          2     7
B      Y      c          3     8
       Z      a          4     9
</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p>기본적으로 <code>key</code>값을 지정하면 해당 값의 하위 분류를 출력합니다.</p>
<pre><code class="language-python">print(df.xs(key=&#39;A&#39;))
&gt;&gt;
               col1  col2
level1 level2
A      X      a          0     5
              a          1     6
       Y      b          2     7
#B      Y      c          3     8
#       Z      a          4     9
#여기는 제외된
</code></pre>
<p><code>key</code>값을 여러 값으로 지정할 수 도 있습니다.</p>
<pre><code class="language-python">print(df.xs(key=(&#39;A&#39;,&#39;X&#39;)))#의 하위분류를 하기 때문에
&gt;&gt;

        col1  col2
level2            
a          0     5
a          1     6

                      col1  col2
level0 level1 level2
A      X      /a          0     5
              /a          1     6
       Y      /b          2     7
                      ////////////////////
B      Y      c          3     8
       Z      a          4     9
</code></pre>
<p><code>level</code>을 지정하여 하위분류를 진행할 수 있습니다.</p>
<pre><code class="language-python">print(df.xs(key=&#39;Y&#39;,level=1))
&gt;&gt;
               col1  col2
level0 level2            
A      b          2     7
B      c          3     8

                      col1  col2
level0 level1 level2
A      X      a          0     5
              a          1     6
/////////////////////////////////
       Y!      b          2     7
B      Y!      c          3     8
/////////////////////////////////
       Z      a          4     9
</code></pre>
<p><code>drop_level=True</code>로 할 경우 <code>key</code>값으로 지정된 레벨을 포함해서 줄력합니다.</p>
<pre><code class="language-python">print(df.xs(key=&#39;Y&#39;,level=1,drop_level=True)) #False가 기본이다 
&gt;&gt;
                      col1  col2
level0 level1 level2
A      Y      b          2     7
B      Y      c          3     8</code></pre>
<h1 id="피벗화-열의-인덱스화-stack"><strong>피벗화, 열의 인덱스화 (stack)</strong></h1>
<p><code>stack</code> 메서드는 열을 피벗하여 하위 인덱스로 변환하는 메서드입니다.</p>
<p><code>level</code> : MultiColumns의 경우 하위인덱스로 변환할 열의 레벨입니다. 기본값은 -1로 최하위 레벨이 선택됩니다. <code>dropna</code> : {True / False} 기본값은 True로 피벗화로인해 생성된 하위인덱스의 모든 값이 결측치(NaN)인 경우 해당 열이 제거됩니다.</p>
<pre><code class="language-python">data = [[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]]
idx = [[&#39;idx1&#39;,&#39;idx1&#39;,&#39;idx2&#39;,&#39;idx2&#39;],[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]]
col = [[&#39;val1&#39;,&#39;val1&#39;,&#39;val2&#39;,&#39;val2&#39;],[&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;]]
df = pd.DataFrame(data = data, index = idx, columns = col)
print(df)
&gt;&gt;
           val1      val2
           col1 col2 col3 col4
idx1 row1     0    1    2    3
     row2     4    5    6    7
idx2 row3     8    9   10   11
     row4    12   13   14   15
</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p>&#39;level&#39;의 기본값은 &#39;-1&#39;로 최하위 레벨이 선택됩니다. 위 df에서는 level=1이 최하위 계층이기 때문에,</p>
<p><code>df.stack( ) = df.stack(level=1)</code> 입니다. 함수 실행 시 <code>level=1</code>의 열이 인덱스로 피벗된걸 확인할 수 있습니다.</p>
<pre><code class="language-python">print(df.stack())# 있지 않은 값은 결측값이 된걸 볼 수 있다
&gt;&gt;
                val1  val2
idx1 row1 col1   0.0   NaN
          col2   1.0   NaN
          col3   NaN   2.0
          col4   NaN   3.0
     row2 col1   4.0   NaN
          col2   5.0   NaN
          col3   NaN   6.0
          col4   NaN   7.0
idx2 row3 col1   8.0   NaN
          col2   9.0   NaN
          col3   NaN  10.0
          col4   NaN  11.0
     row4 col1  12.0   NaN
          col2  13.0   NaN
          col3   NaN  14.0
          col4   NaN  15.0
</code></pre>
<p><code>level=0</code>인 경우 아래와같이 &#39;val1&#39;, &#39;val2&#39;가 포함된 <code>level=0</code>의 열이 피벗화 되는것을 볼 수 있습니다.</p>
<pre><code class="language-python">print(df.stack(level=0))# 레벨 0일 경우 val1,val2가 피벗화 된걸 확인 할 수 있다
&gt;&gt;
                col1  col2  col3  col4
idx1 row1 val1   0.0   1.0   NaN   NaN
          val2   NaN   NaN   2.0   3.0
     row2 val1   4.0   5.0   NaN   NaN
          val2   NaN   NaN   6.0   7.0
idx2 row3 val1   8.0   9.0   NaN   NaN
          val2   NaN   NaN  10.0  11.0
     row4 val1  12.0  13.0   NaN   NaN
          val2   NaN   NaN  14.0  15.0
</code></pre>
<p><code>level=(0,1)</code>처럼 튜플로 묶어줄 경우 해당되는 모든 계층에 대해 피벗화를 할 수 있습니다.</p>
<p>모든 계층(레벨)이 피벗화 될 경우 Serise 객체로 출력됩니다.</p>
<pre><code class="language-python">print(df.stack(level=(0,1))) 
&gt;&gt;
idx1  row1  val1  col1     0.0
                  col2     1.0
            val2  col3     2.0
                  col4     3.0
      row2  val1  col1     4.0
                  col2     5.0
            val2  col3     6.0
                  col4     7.0
idx2  row3  val1  col1     8.0
                  col2     9.0
            val2  col3    10.0
                  col4    11.0
      row4  val1  col1    12.0
                  col2    13.0
            val2  col3    14.0
                  col4    15.0
dtype: float64
</code></pre>
<p><strong>dropna인수의 사용</strong></p>
<p><code>dropna</code>인수는 기본값이 <code>True</code>로 열이 피벗화된 인덱스의 값이 <code>NaN</code>이면 해당 열을 출력하지 않습니다.</p>
<p>예시를 위해 간단한 2x2 짜리 데이터를 만들어보겠습니다.</p>
<pre><code class="language-python">data = [[np.NaN,1],[2,3]]
idx = [&#39;row1&#39;,&#39;row2&#39;]
col = [&#39;col1&#39;,&#39;col2&#39;]
df = pd.DataFrame(data = data, index = idx, columns = col)
print(df)
&gt;&gt;
      col1  col2
row1   NaN     1
row2   2.0     3
</code></pre>
<p><code>stack</code>메서드를 사용할 경우 <code>col1</code>, <code>col2</code> 열이 인덱스로 피벗화되는데, <code>row1-col1</code>의 값은 <code>NaN</code>이기 때문에 출력에서는 아래와같이 제거됩니다.</p>
<pre><code class="language-python">print(df.stack())#결측값이 제거된걸 볼 수 있다, 모든 열이 피벗화가 되었기 때문에 시리즈로 출력한다
&gt;&gt;
row1  col2    1.0 
row2  col1    2.0
      col2    3.0
dtype: float64
</code></pre>
<p><code>dropna=True</code>로 출력 할 경우 결측값을 갖는 열 또한 정상적으로 출력되는것을 볼 수 있습니다.</p>
<pre><code class="language-python">print(df.stack(dropna=False))#결측값이 포함되어 정상적으로 출력되는걸 확인할 수 있다
&gt;&gt;
row1  col1    NaN
      col2    1.0
row2  col1    2.0
      col2    3.0
dtype: float64</code></pre>
<h1 id="언피벗화-행의-열로-변환-unstack"><strong>언피벗화, 행의 열로 변환 (unstack)</strong></h1>
<p><code>unstack</code> 메서드는 행을 언피벗하여 하위 열로 변환하는 메서드입니다.</p>
<p><code>level</code> : MultiIndex의 경우 하위열로 변환할 행의 레벨입니다. 기본값은 -1로 최하위 레벨이 선택됩니다.</p>
<p><code>fill_value</code> : 생성된 열의 값에 결측치가 있을 경우 대체할 값입니다.</p>
<pre><code class="language-python">data =[1,2,3,4,5]
idx = [[&#39;idx1&#39;,&#39;idx1&#39;,&#39;idx2&#39;,&#39;idx2&#39;,&#39;idx2&#39;],[&#39;row1&#39;,&#39;row2&#39;,&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]]
df = pd.Series(data=data, index = idx)
print(df)
&gt;&gt;
idx1  row1    1
      row2    2
idx2  row1    3
      row2    4
      row3    5
dtype: int64</code></pre>
<p><code>level</code>은 기본값이 -1이며, 최하위 레벨의 행에 대해 열로 언피벗 합니다.</p>
<p>아래 예시를 보면 최 하위 계층인 <code>row1</code>,<code>row2</code>가 속한 인덱스가 열로 언피벗 된것을 확인할 수 있습니다.</p>
<pre><code class="language-python">print(df.unstack()) #출력을 보면 row가 위로 올라가면서 언피벗된걸 확인할 수 있
&gt;&gt;
      row1  row2  row3
idx1   1.0   2.0   NaN
idx2   3.0   4.0   5.0
</code></pre>
<p><code>fill_value</code> 인수를 사용할 경우, 언피벗으로 인해 행성된 결측치를 특정 값으로 지정할 수 있습니다.</p>
<pre><code class="language-python">print(df.unstack(fill_value=&#39;-&#39;))#결측값을 특정 값으로 지정해준다 피벗화에서도 똑같이 가능하다
&gt;&gt;
     row1 row2 row3
idx1    1    2    -
idx2    3    4    5
</code></pre>
<p>좀 더 큰 다중인덱스에 대해서 예시를 들어보기위해 4레벨의 멀티인덱스를 생성해보겠습니다.</p>
<pre><code class="language-python">data = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
level0=[&#39;idx1&#39;,&#39;idx1&#39;,&#39;idx1&#39;,&#39;idx1&#39;,&#39;idx1&#39;,&#39;idx1&#39;,&#39;idx1&#39;,&#39;idx1&#39;,
        &#39;idx2&#39;,&#39;idx2&#39;,&#39;idx2&#39;,&#39;idx2&#39;,&#39;idx2&#39;,&#39;idx2&#39;,&#39;idx2&#39;,&#39;idx2&#39;]
level1=[&#39;row1&#39;,&#39;row1&#39;,&#39;row1&#39;,&#39;row1&#39;,&#39;row2&#39;,&#39;row2&#39;,&#39;row2&#39;,&#39;row2&#39;,
        &#39;row3&#39;,&#39;row3&#39;,&#39;row3&#39;,&#39;row3&#39;,&#39;row4&#39;,&#39;row4&#39;,&#39;row4&#39;,&#39;row4&#39;]
level2=[&#39;val1&#39;,&#39;val1&#39;,&#39;val2&#39;,&#39;val2&#39;,&#39;val1&#39;,&#39;val1&#39;,&#39;val2&#39;,&#39;val2&#39;,
        &#39;val1&#39;,&#39;val1&#39;,&#39;val2&#39;,&#39;val2&#39;,&#39;val1&#39;,&#39;val1&#39;,&#39;val2&#39;,&#39;val2&#39;]
level3=[&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;,&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;,
        &#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;,&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;]
idx = [level0,level1,level2,level3]
df = pd.Series(data =data, index =idx)
print(df)
&gt;&gt;
idx1  row1  val1  col1     0
                  col2     1
            val2  col3     2
                  col4     3
      row2  val1  col1     4
                  col2     5
            val2  col3     6
                  col4     7
idx2  row3  val1  col1     8
                  col2     9
            val2  col3    10
                  col4    11
      row4  val1  col1    12
                  col2    13
            val2  col3    14
                  col4    15
dtype: int64
</code></pre>
<p><code>val1</code>, <code>val2</code>가 속한 <code>level=2</code>로 <code>unstack</code>메서드를 실행해보겠습니다.</p>
<pre><code class="language-python">print(df.unstack(level=2))#level=2가 언피벗화가 된걸 확일할 수 있다
&gt;&gt;
                val1  val2
idx1 row1 col1   0.0   NaN
          col2   1.0   NaN
          col3   NaN   2.0
          col4   NaN   3.0
     row2 col1   4.0   NaN
          col2   5.0   NaN
          col3   NaN   6.0
          col4   NaN   7.0
idx2 row3 col1   8.0   NaN
          col2   9.0   NaN
          col3   NaN  10.0
          col4   NaN  11.0
     row4 col1  12.0   NaN
          col2  13.0   NaN
          col3   NaN  14.0
          col4   NaN  15.0
</code></pre>
<p><code>level</code>에 튜플을 이용하여 Multi Columns로 <code>unstack</code>을 실행할 수 있습니다.</p>
<pre><code class="language-python">print(df.unstack(level=(2,3)))
&gt;&gt;
          col1 col2 col3 col4
idx1 row1    0    1    2    3
     row2    4    5    6    7
idx2 row3    8    9   10   11
     row4   12   13   14   15</code></pre>
<h1 id="인덱스-순서변경-swaplevel"><strong>인덱스 순서변경 (swaplevel)</strong></h1>
<p><code>swaplevel</code>메서드는 Multi Index (또는 Munti Columns)에서 두 인덱스의 순서를 변경하는 메서드입니다.</p>
<p><code>i , j</code> : 순서를 변경할 두 인덱스의 레벨입니다. 기본적으로 제일 낮은 두 레벨의 인덱스가 교환됩니다.(-2, -1)</p>
<p><code>axis</code> : 기본값은 0으로 <code>axis=1</code>로 변경할 경우 Multi Columns에 대해 메서드가 수행됩니다.</p>
<pre><code class="language-python">data = {&#39;col&#39;:[0,1,2,3,4,5]}
level0 = [&#39;idx1&#39;,&#39;idx1&#39;,&#39;idx1&#39;,&#39;idx1&#39;,&#39;idx2&#39;,&#39;idx2&#39;]
level1 = [&#39;val1&#39;,&#39;val1&#39;,&#39;val2&#39;,&#39;val2&#39;,&#39;val3&#39;,&#39;val4&#39;]
level2 = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;,&#39;row5&#39;,&#39;row6&#39;]
idx = [level0, level1, level2]
df = pd.DataFrame(data = data, index=idx)
print(df)
&gt;&gt;
                col
idx1 val1 row1    0
          row2    1
     val2 row3    2
          row4    3
idx2 val3 row5    4
     val4 row6    5
</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p><code>i, j</code>인수에 아무것도 입력하지 않는다면, 제일 낮은 두 레벨의 인덱스가 교환됩니다.</p>
<pre><code class="language-python">print(df.swaplevel())
&gt;&gt;
                col
idx1 row1 val1    0 # 인덱스의 level1과 level2의 위치가 바뀐것을 확인.
     row2 val1    1
     row3 val2    2
     row4 val2    3
idx2 row5 val3    4
     row6 val4    5
</code></pre>
<p>인수로 한 숫자만 입력하게되면, 가장 낮은 레벨의 인덱스와 인수로 입력한 숫자에 해당하는 레벨의 인덱스가 교환됩니다.</p>
<pre><code class="language-python">print(df.swaplevel(0))
&gt;&gt;
                col
row1 val1 idx1    0 #인덱스의 level0과 최하위 레벨의 인덱스의 위치가 바뀐것을 확인.
row2 val1 idx1    1
row3 val2 idx1    2
row4 val2 idx1    3
row5 val3 idx2    4
row6 val4 idx2    5
</code></pre>
<p>두 값을 지정하여 원하는 인덱스끼리의 교환이 가능합니다. 레벨명이 있다면 레벨명을 쓸 수도 있습니다.</p>
<pre><code class="language-python">print(df.swaplevel(i=0,j=1))#이거는 왜 지정하는지 모르겠다 컬러쪽에 레벨이 하나 더 있어도 axis로 구별을 안하면 행과 열도 같이 스왑 되는게 똑같다 굳이 왜 지정을 해서 바꾸는지 이해를 못함
&gt;&gt;
                col
val1 idx1 row1    0 # 레벨0과 레벨1의 위치가 바뀐것을 확인.
          row2    1
val2 idx1 row3    2
          row4    3
val3 idx2 row5    4
val4 idx2 row6    5</code></pre>
<h1 id="인덱스-제거-droplevel"><strong>인덱스 제거 (droplevel)</strong></h1>
<p><code>droplevel</code> 메서드는 Multi Index나 Multi Columns에서 특정 레벨을 제거하는 메서드입니다.</p>
<p><code>level</code> : 제거할 단계 입니다.</p>
<p><code>axis</code> : 특정 레벨을 제거할 축 입니다.</p>
<pre><code class="language-python">data= [[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]]
idx = [[&#39;idx1&#39;,&#39;idx1&#39;,&#39;idx2&#39;,&#39;idx2&#39;],[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]]
col = [[&#39;col1&#39;,&#39;col1&#39;,&#39;col2&#39;,&#39;col2&#39;],[&#39;val1&#39;,&#39;val2&#39;,&#39;val3&#39;,&#39;val4&#39;]]
df = pd.DataFrame(data=data, index = idx, columns = col)
print(df)
&gt;&gt;
          col1      col2
          val1 val2 val3 val4
idx1 row1    0    1    2    3
     row2    4    5    6    7
idx2 row3    8    9   10   11
     row4   12   13   14   15
</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p><code>level</code>에 제거를 원하는 레벨을 입력함으로서 해당 레벨을 제거하여 값을 출력할 수 있습니다.</p>
<p><code>level=0</code>인 경우 Multi Index의 level=0인 <code>idx1</code>, <code>idx2</code>가 제거된 것을 알 수 있습니다.</p>
<pre><code class="language-python">print(df.droplevel(axis=0,level=0))
&gt;&gt;
     col1      col2
     val1 val2 val3 val4
row1    0    1    2    3 # idx가 제거됨
row2    4    5    6    7
row3    8    9   10   11
row4   12   13   14   15
</code></pre>
<p><code>level=1</code>인 경우 Multi Index의 level=1인 <code>row1</code>, <code>row2</code>, <code>row3</code>, <code>row4</code>가 제거된 것을 알 수 있습니다.</p>
<pre><code class="language-python">print(df.droplevel(axis=0,level=1))
&gt;&gt;
     col1      col2
     val1 val2 val3 val4
idx1    0    1    2    3 # row가 제거됨
idx1    4    5    6    7
idx2    8    9   10   11
idx2   12   13   14   15
</code></pre>
<p><code>axis=1</code>인 경우 Multi Columns에 대해서 특정 레벨을 제거 할 수 있습니다.</p>
<pre><code class="language-python">print(df.droplevel(axis=1,level=0))
&gt;&gt;
           val1  val2  val3  val4 # col이 제거됨
idx1 row1     0     1     2     3
     row2     4     5     6     7
idx2 row3     8     9    10    11
     row4    12    13    14    15
</code></pre>
<pre><code class="language-python">Copyprint(df.droplevel(axis=1,level=1))
&gt;&gt;
           col1  col1  col2  col2 # vol이 제거됨
idx1 row1     0     1     2     3
     row2     4     5     6     7
idx2 row3     8     9    10    11
     row4    12    13    14    15</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-05-08]]></title>
            <link>https://velog.io/@smile_07/2025-05-08</link>
            <guid>https://velog.io/@smile_07/2025-05-08</guid>
            <pubDate>Thu, 08 May 2025 11:21:35 GMT</pubDate>
            <description><![CDATA[<h1 id="특정시간-필터링at-time">특정시간 필터링(at time)</h1>
<p><code>time</code> : 기준이 될 시간 입니다.</p>
<p><code>asof</code> : 현재 미사용 입니다.</p>
<p><code>axis</code> : 기준이 될 축 입니다.</p>
<pre><code class="language-python">i = pd.date_range(&#39;2021-12-24&#39;, periods=10, freq=&#39;6H&#39;)
# 2021-12-24를 시작으로 10기간(간격 6H)의 데이터 생성.
# 2021-12-24를 시작으로 periods=10 (10개까지 출력)  freq=&#39;6H&#39;(6시간 간격으로)
df = pd.DataFrame({&#39;col1&#39;:[1,2,3,4,5,6,7,8,9,10]}, index=i)
print(df)
&gt;&gt;
                     col1
2021-12-24 00:00:00     1
2021-12-24 06:00:00     2
2021-12-24 12:00:00     3
2021-12-24 18:00:00f4
2021-12-25 00:00:00     5
2021-12-25 06:00:00     6
2021-12-25 12:00:00     7
2021-12-25 18:00:00     8
2021-12-26 00:00:00     9
2021-12-26 06:00:00    10
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p>위 시간에 대해서 시간이 <code>06:00</code>인 값만 출력해보도록 하겠습니다.</p>
<pre><code class="language-python">print(df.at_time(&#39;06:00&#39;))
&gt;&gt;
                     col1
2021-12-24 06:00:00     2
2021-12-25 06:00:00     6
2021-12-26 06:00:00    10</code></pre>
<p>df.between_time(start_time, end_time, include_start=True, include_end=True, axis=None)</p>
<p><code>start_time</code> : 기준이 될 시작 시간입니다.</p>
<p><code>end_time</code> : 기준이 될 끝 시간입니다.</p>
<p><code>include_start</code> : 시작 시간을 포함할지 여부입니다.</p>
<p><code>inclusive_end</code> : 끝 시간을 포함할지 여부입니다.</p>
<p><code>axis</code> : 기준이 될 축 입니다.</p>
<pre><code class="language-python">i = pd.date_range(&#39;2021-12-24&#39;, periods=10, freq=&#39;1H&#39;)
df = pd.DataFrame({&#39;col1&#39;:[1,2,3,4,5,6,7,8,9,10]}, index=i)
print(df)
&gt;&gt;
                     col1
2021-12-24 00:00:00     1
2021-12-24 01:00:00     2
2021-12-24 02:00:00     3
2021-12-24 03:00:00     4
2021-12-24 04:00:00     5
2021-12-24 05:00:00     6
2021-12-24 06:00:00     7
2021-12-24 07:00:00     8
2021-12-24 08:00:00     9
2021-12-24 09:00:00    10
</code></pre>
<p>3시에서 6시 사이만 출력</p>
<pre><code class="language-python">print(df.between_time(start_time=&#39;03:00&#39;,end_time=&#39;06:00&#39;))
&gt;&gt;
                     col1
2021-12-24 03:00:00     4
2021-12-24 04:00:00     5
2021-12-24 05:00:00     6
2021-12-24 06:00:00     7</code></pre>
<h2 id="inclusive-bothnone로-시작과-끝을-제외할-수-있다">inclusive= both/none로 시작과 끝을 제외할 수 있다</h2>
<pre><code class="language-python">print(df.between_time(start_time=&#39;03:00&#39;,end_time=&#39;06:00&#39;,inclusive= &#39;neither&#39;))
&gt;&gt;
                     col1
2021-12-24 04:00:00     5
2021-12-24 05:00:00     6
# 03:00과 06:00이 제외됨.

&#39;both&#39; (기본값): 시작과 끝 모두 포함

&#39;left&#39;: 시작 시간만 포함

&#39;right&#39;: 끝 시간만 포함

&#39;neither&#39;: 둘 다 포함하지 않음
</code></pre>
<p><strong>해당 시간을 제외한 시간 필터링</strong></p>
<p><code>start_time</code>을 <code>end_time</code>보다 늦은 시간으로 둘 경우, 두 시간사이를 제외한 값을 출력합니다.</p>
<pre><code class="language-python">print(df.between_time(start_time=&#39;06:00&#39;,end_time=&#39;03:00&#39;))
# start_time이 end_time보다 늦음
&gt;&gt;
                     col1
2021-12-24 00:00:00     1
2021-12-24 01:00:00     2
2021-12-24 02:00:00     3
2021-12-24 03:00:00     4
2021-12-24 06:00:00     7
2021-12-24 07:00:00     8
2021-12-24 08:00:00     9
2021-12-24 09:00:00    10
#03:00 ~ 06:00을 제외한 시간이 출력됨.
</code></pre>
<h1 id="처음끝-특정기간-필터링-first--last"><strong>처음/끝 특정기간 필터링 (first / last)</strong></h1>
<pre><code class="language-python">i = pd.date_range(&#39;2021-12-06&#39;, periods=5, freq=&#39;3D&#39;)
# 2021-12-06을 시작일로 3일 간격의 5개 날짜 데이터를 생성
df = pd.DataFrame({&#39;col1&#39;:[1,2,3,4,5]}, index=i)
print(df)
&gt;&gt;
            col1
2021-12-06     1
2021-12-09     2
2021-12-12     3
2021-12-15     4
2021-12-18     5
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p><code>offset</code>은 기준이 될 <code>기간</code>을 선택합니다. 출력할 갯수가 아님을 명심해야합니다.</p>
<pre><code class="language-python">print(df.first(&#39;4D&#39;))
&gt;&gt;
            col1
2021-12-06     1
2021-12-09     2
# 첫날짜 기준으로 4일간의 데이터를 필터링함. 4개 날짜의 출력이 아니라 4일동안.
</code></pre>
<p><code>last</code> 메서드의 경우도 동일합니다.</p>
<pre><code class="language-python">Copyprint(df.last(&#39;4D&#39;))
&gt;&gt;
            col1
2021-12-15     4
2021-12-18     5
# 마지막 날짜 기준으로 4일간의 데이터를 필터링.</code></pre>
<h1 id="timezone변경표준시간대-tz_convert"><strong>Timezone변경[표준시간대] (tz_convert)</strong></h1>
<p><code>tz</code> : 변경의 대상이 되는 시간대 입니다.</p>
<p><code>level</code> : 멀티인덱스의 경우 레벨을 지정할 수 있습니다.</p>
<p><code>copy</code> : 사본을 생성할지 여부입니다.</p>
<pre><code class="language-python">dr = pd.date_range(start=&#39;2021-12-29 09:00&#39;, freq=&#39;H&#39;, periods=4, tz=&#39;US/Eastern&#39;)
# date_range를 통해 기본 시간과 간격을 설정하고, tz인수를통해 timezone을 지정.
df=pd.DataFrame(index=dr, data={&#39;Seoul&#39;:[0,0,0,0],&#39;None&#39;:[0,0,0,0]})
print(df)
&gt;&gt;
                           Seoul  None
2021-12-29 09:00:00-05:00      0     0
2021-12-29 10:00:00-05:00      0     0
2021-12-29 11:00:00-05:00      0     0
2021-12-29 12:00:00-05:00      0     0
&lt;ipython-input-17-28825d943d68&gt;:1: FutureWarning: &#39;H&#39; is deprecated and will be removed in a future version, please use &#39;h&#39; instead.
  dr = pd.date_range(start=&#39;2021-12-29 09:00&#39;, freq=&#39;H&#39;, periods=4, tz=&#39;US/Eastern&#39;)</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p>단순히 원하는<code>timezone</code>을 지정함으로서 시간대의 변경이 가능합니다.</p>
<p>기본적으로 <code>지역(대륙)/도시</code> 형식으로 지원되며, 첫글자는 대문자여야 합니다. <code>Asia/Seoul</code>을 통해 서울 표준시로 변경해보겠습니다.</p>
<pre><code class="language-python">data1 = dr.tz_convert(&#39;Asia/Seoul&#39;)
# 지역/도시명 으로 표준시를 변경할 수 있습니다.
data2 = dr.tz_convert(None)
# None을 입력할 경우 시간대가 삭제됩니다.
df = pd.DataFrame(data={&#39;Seoul&#39;:data1,&#39;None&#39;:data2},index=dr)
print(df)
&gt;&gt;
                                              Seoul                None
2021-12-29 09:00:00-05:00 2021-12-29 23:00:00+09:00 2021-12-29 14:00:00
2021-12-29 10:00:00-05:00 2021-12-30 00:00:00+09:00 2021-12-29 15:00:00
2021-12-29 11:00:00-05:00 2021-12-30 01:00:00+09:00 2021-12-29 16:00:00
2021-12-29 12:00:00-05:00 2021-12-30 02:00:00+09:00 2021-12-29 17:00:00</code></pre>
<h1 id="timezone설정표준시간대-tz_localize"><strong>Timezone설정[표준시간대] (tz_localize)</strong></h1>
<p><code>tz</code> : 변경의 대상이 되는 시간대 입니다.</p>
<p><code>axis</code> : 변경을 진행할 축 입니다..</p>
<p><code>copy</code> : 사본을 생성할지 여부입니다.</p>
<p><code>ambiguous</code> : DST(일광절약시) 즉, 서머타임이 적용될 경우 시간대가 꼬일 수 있습니다. 한쪽은 DST를 적용하는데, 한쪽은 적용하지 않는경우 등입니다.</p>
<p>이 때, <code>ambiguous</code>인수를 통해 모호한 시간 처리를 할 수 있습니다.</p>
<blockquote>
<p>infer 은 가을-DST 전환 시간을 추론합니다.</p>
<p>True인 경우 DST시간대이며, False인 경우 DST시간대가 아닌 경우입니다.</p>
<p>NaT인 경우 모호한 시간대면 NaT를 반환합니다.</p>
<p>raise인 경우 모호한 시간대면 AmbiguousTimeError를 발생시킵니다.</p>
</blockquote>
<p><code>nonexistent</code> : DST를통해 시간이 당겨질 경우, 특정시간대는 존재하지 않을 수 있습니다.</p>
<blockquote>
<p>shift_forward인 경우 존재하지 않는 시간을 가장 가까운 시간대로 당겨서 출력합니다.</p>
<p>shift_backward인 경우 존재하지 않는 시간을 가장 가까운 시간대로 미뤄서 출력합니다.</p>
<p>NaT인 경우 존재하지 않는 시간을 NaT로 출력합니다.</p>
<p>Timedelta값을 입력하는 경우 Timedelta값 만큼 이동합니다.</p>
<p>raise인 경우 존재하지 않는 시간이 발생하면 NonExistentTimeError를 발생시킵니다.</p>
</blockquote>
<p><code>tz_convert</code>의 예시와 같지만, <code>date_range</code>생성 단계에서 tz인수를 삭제하여 시간대를 설정하지 않고 진행해보겠습니다.</p>
<pre><code class="language-python">dr = pd.date_range(start=&#39;2021-12-29 09:00&#39;, freq=&#39;H&#39;, periods=4)
# tz인수를 삭제하여 시간대 미설정으로 진행
df=pd.DataFrame(index=dr, data={&#39;Seoul&#39;:[0,0,0,0],&#39;None&#39;:[0,0,0,0]})
print(df)
&gt;&gt;
                     Seoul  None
2021-12-29 09:00:00      0     0
2021-12-29 10:00:00      0     0
2021-12-29 11:00:00      0     0
2021-12-29 12:00:00      0     0
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p>이 상태에서 <code>tz_convert</code>를 진행하면 tz_convert raise TypeError가 발생합니다.</p>
<p>기존 시간대가 지정되어있지 않기 때문에 tz_convert를 진행하지 못하기 때문입니다.</p>
<pre><code class="language-python">data1 = dr.tz_convert(&#39;Asia/Seoul&#39;)
&gt;&gt;
Traceback (most recent call last):
...
TypeError: Cannot convert tz-naive timestamps, use tz_localize to localize
</code></pre>
<p>바로 이 경우에 <code>tz_localize</code>메서드를 통해 시간대를 지정해줄 수 있습니다.</p>
<pre><code class="language-python">dr = pd.date_range(start=&#39;2021-12-29 09:00&#39;, freq=&#39;H&#39;, periods=4)
dr = dr.tz_localize(&#39;US/Eastern&#39;) # 설정된 dr에 시간대를 설정
df = pd.DataFrame(index=dr, data={&#39;Seoul&#39;:[0,0,0,0],&#39;None&#39;:[0,0,0,0]})
print(df)
&gt;&gt;
                           Seoul  None
2021-12-29 09:00:00-05:00      0     0 # 정상적으로 시간대가 설정됨
2021-12-29 10:00:00-05:00      0     0
2021-12-29 11:00:00-05:00      0     0
2021-12-29 12:00:00-05:00      0     0
#tz_localize메서드를 통해서 Asia/seoul을 US/Eastern으로 변경한것을 확인 할 수 있다</code></pre>
<p>이제 <code>tz_convert</code>를 진행하면 정상적으로 되는것을 확인할 수 있습니다.</p>
<pre><code class="language-python">data1 = dr.tz_convert(&#39;Asia/Seoul&#39;)
data2 = dr.tz_convert(None)
df = pd.DataFrame(data={&#39;Seoul&#39;:data1,&#39;None&#39;:data2},index=dr)
print(df)
&gt;&gt;
                                              Seoul                None
2021-12-29 09:00:00-05:00 2021-12-29 23:00:00+09:00 2021-12-29 14:00:00
2021-12-29 10:00:00-05:00 2021-12-30 00:00:00+09:00 2021-12-29 15:00:00
2021-12-29 11:00:00-05:00 2021-12-30 01:00:00+09:00 2021-12-29 16:00:00
2021-12-29 12:00:00-05:00 2021-12-30 02:00:00+09:00 2021-12-29 17:00:00
</code></pre>
<p>즉, 요약하자면 TimeStamp나 DateRange를 생성할 때 tz인수를 입력하는것과</p>
<p>만들어진 객체에 <code>tz_localize</code>인수를 통해 시간대를 설정하는것은 동일한 결과를 가집니다.</p>
<p>※아래 두 경우는 동일함</p>
<pre><code class="language-python">dr = pd.date_range(start=&#39;2021-12-29 09:00&#39;, freq=&#39;H&#39;, periods=4, tz=&#39;US/Eastern&#39;)
</code></pre>
<pre><code class="language-python">dr = pd.date_range(start=&#39;2021-12-29 09:00&#39;, freq=&#39;H&#39;, periods=4).tz_localize(&#39;US/Eastern&#39;)</code></pre>
<h1 id="timestamp변환to_timestamp"><strong>TimeStamp변환(to_timestamp)</strong></h1>
<p><code>freq</code> : timestamp로의 기준이 되는 주기 입니다. [Y/M/D, H/T(min)/S 등등..], 더 많은 freq항목은 <a href="https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html">이 링크</a>의 <strong>DateOffset objects 항목</strong>에서 확인 바랍니다.</p>
<p><code>how</code> : {start / end} 기간의 시작을 기준으로할지, 끝을 기준으로 할지 정합니다.</p>
<p><code>axis</code> : 기준이 될 축을 지정합니다.</p>
<p><code>copy</code> : 사본을 생성할지 여부입니다.</p>
<h2 id="예시"><strong>예시</strong></h2>
<p><code>pd.period_range</code>를 이용해 기준시간에 대해 일정 간격을 가진 datetime index를 생성하겠습니다.</p>
<pre><code class="language-python">period = pd.period_range(start=&#39;2021-10-04 00:00:00&#39;,end=&#39;2021-10-04 01:00:00&#39;,freq=&#39;30T&#39;)
# 2021-10-04 00:00:00부터 2021-10-04 01:00:00 까지 30분 단위로 인덱스 생성
# 여기서 T는 min을 의미합니다.
df=pd.DataFrame(data=range(len(period)),index=period)
print(df)
&gt;&gt;
                  0
2021-10-04 00:00  0
2021-10-04 00:30  1
2021-10-04 01:00  2
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p>먼저 <code>how=start</code>로 하여 시작시간을 기준으로 freq를 변경해가면서 datetime index가 어떻게 timestamp화되는지 확인해보겠습니다.</p>
<pre><code class="language-python">print(df.to_timestamp(freq=&quot;S&quot;,how=&#39;start&#39;))
&gt;&gt;
                     0
2021-10-04 00:00:00  0
2021-10-04 00:30:00  1
2021-10-04 01:00:00  2
</code></pre>
<pre><code class="language-python">print(df.to_timestamp(freq=&quot;T&quot;,how=&#39;start&#39;))#= T는 (min)분으로 month가 M을 가져갔기 때문에 T로 대체되었
&gt;&gt;
                     0
2021-10-04 00:00:00  0
2021-10-04 00:30:00  1
2021-10-04 01:00:00  2
</code></pre>
<pre><code class="language-python">print(df.to_timestamp(freq=&quot;H&quot;,how=&#39;start&#39;))
&gt;&gt;
                     0
2021-10-04 00:00:00  0
2021-10-04 00:00:00  1
2021-10-04 01:00:00  2
</code></pre>
<pre><code class="language-python">print(df.to_timestamp(freq=&quot;D&quot;,how=&#39;start&#39;))
&gt;&gt;
            0
2021-10-04  0
2021-10-04  1
2021-10-04  2
</code></pre>
<pre><code class="language-python">print(df.to_timestamp(freq=&quot;M&quot;,how=&#39;start&#39;))
&gt;&gt;
            0
2021-10-31  0
2021-10-31  1
2021-10-31  2
</code></pre>
<pre><code class="language-python">print(df.to_timestamp(freq=&quot;Y&quot;,how=&#39;start&#39;))
&gt;&gt;
            0
2021-12-31  0
2021-12-31  1
2021-12-31  2
</code></pre>
<p><code>how=start</code>와 <code>how=end</code>를 비교하여 index가 어떻게 변화하는지 확인 할 수 있습니다.</p>
<pre><code class="language-python">Copyprint(df.to_timestamp(freq=&quot;T&quot;,how=&#39;start&#39;))
print(df.to_timestamp(freq=&quot;T&quot;,how=&#39;end&#39;))
&gt;&gt;
                     0
2021-10-04 00:00:00  0
2021-10-04 00:30:00  1
2021-10-04 01:00:00  2
                               0
2021-10-04 00:29:59.999999999  0
2021-10-04 00:59:59.999999999  1
2021-10-04 01:29:59.999999999  2</code></pre>
<h1 id="리샘플링-resample이해못함"><strong>리샘플링 (resample)%이해못함!!!%</strong></h1>
<p><code>freq</code> : 기준이 될 주기 입니다.</p>
<p><code>method</code> : {bfill / ffill} 리샘플링으로 생성된 빈(NaN) 값을 채울 방식입니다.</p>
<blockquote>
<p>bfill : 아래 값으로 빈 값을 채웁니다.</p>
<p>ffill : 위 값으로 빈 값을 채웁니다.</p>
</blockquote>
<p><code>how</code> : {start / end} period Index에서 사용하는 방식입니다. 유사한 것을 <code>to_timestamp</code>에서 볼 수 있습니다.</p>
<p><code>normalize</code> : {True / False} 출력되는 인덱스를 자정으로 설정할지 여부입니다.</p>
<p><code>fill_value</code> : 리샘플링으로 생성된 빈(NaN) 값을 채울 값입니다.</p>
<h2 id="예시-1"><strong>예시</strong></h2>
<p>먼저 기본적인 사용법 예시를위하여 3x1짜리 데이터를 만들어보겠습니다.</p>
<p><code>pd.date_range</code>를 이용해 기준시간에 대해 일정 간격을 가진 datetime index를 생성하겠습니다.</p>
<pre><code class="language-python">idx = pd.date_range(&#39;2021-12-30&#39;,periods=3,freq=&#39;min&#39;)
# 2021-12-30 기준으로 1분 간격의 3개 값 만듦
df = pd.DataFrame(index=idx, data=[1,None,3],columns=[&#39;col&#39;])
# 값중 하나는 의도적으로 NaN입력
print(df)
&gt;&gt;
                     col
2021-12-30 00:00:00  1.0
2021-12-30 00:01:00  NaN
2021-12-30 00:02:00  3.0
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p>먼저 <code>freq=30S</code>로 하여 1분간격의 데이터를 30초 간격으로 리샘플링 해보겠습니다.</p>
<pre><code class="language-python">print(df.asfreq(freq=&#39;30S&#39;))
&gt;&gt;
                     col
2021-12-30 00:00:00  1.0
2021-12-30 00:00:30  NaN
2021-12-30 00:01:00  NaN
2021-12-30 00:01:30  NaN
2021-12-30 00:02:00  3.0
# 30초 단위의 인덱스가 생성되며 값은 NaN으로 채워짐
</code></pre>
<p><strong>결측치 채우기(method / fill_value)</strong></p>
<p><code>method</code>를 통해 빈 값을 앞이나 뒤의 값으로 채울 수 있으며, <code>fill_value</code>를 통해 지정된 값으로 채울 수 있습니다.</p>
<p><code>method=&#39;bfill&#39;</code>으로 뒤의 값으로 결측치 채우기</p>
<pre><code class="language-python">print(df.asfreq(freq=&#39;30S&#39;,method=&#39;bfill&#39;))
&gt;&gt;
                     col
2021-12-30 00:00:00  1.0
2021-12-30 00:00:30  NaN
2021-12-30 00:01:00  NaN
2021-12-30 00:01:30  3.0
2021-12-30 00:02:00  3.0
</code></pre>
<p><code>method=&#39;ffill&#39;</code>으로 앞의 값으로 결측치 채우기</p>
<pre><code class="language-python">print(df.asfreq(freq=&#39;30S&#39;,method=&#39;ffill&#39;))
&gt;&gt;
                     col
2021-12-30 00:00:00  1.0
2021-12-30 00:00:30  1.0
2021-12-30 00:01:00  NaN
2021-12-30 00:01:30  NaN
2021-12-30 00:02:00  3.0
</code></pre>
<p><code>fill_value</code>를 입력하여 결측치를 채우기</p>
<pre><code class="language-python">print(df.asfreq(freq=&#39;30S&#39;,fill_value=&#39;-&#39;))
&gt;&gt;                     col
2021-12-30 00:00:00  1.0
2021-12-30 00:00:30    -
2021-12-30 00:01:00  NaN
2021-12-30 00:01:30    -
2021-12-30 00:02:00  3.0
</code></pre>
<p><strong>자정 기준으로 변경(normalize)</strong></p>
<p><code>normalize</code>인수를 통해 시간기준을 자정(00:00:00)으로 고정할 수 있습니다.</p>
<p>예시를 위해 날짜 기준으로 3일치 데이터를 만들어보겠습니다.</p>
<pre><code class="language-python">idx = pd.date_range(&#39;2021-12-20&#39;,periods=3,freq=&#39;D&#39;)
df = pd.DataFrame(index=idx, data=[1,2,3],columns=[&#39;col&#39;])
print(df)
&gt;&gt;
            col
2021-12-20    1
2021-12-21    2
2021-12-22    3
</code></pre>
<p>이제 이 데이터를 <code>asfreq</code>를 통해 8시간 기준으로 리샘플링 해보겠습니다.</p>
<pre><code class="language-python">print(df.asfreq(freq=&#39;8H&#39;))
&gt;&gt;
                     col
2021-12-20 00:00:00  1.0
2021-12-20 08:00:00  NaN
2021-12-20 16:00:00  NaN
2021-12-21 00:00:00  2.0
2021-12-21 08:00:00  NaN
2021-12-21 16:00:00  NaN
2021-12-22 00:00:00  3.0
</code></pre>
<p>이제 <code>normalize=True</code>를 하여 시간대를 자정으로 고정해보겠습니다.</p>
<pre><code class="language-python">print(df.asfreq(freq=&#39;8H&#39;,normalize=True))
&gt;&gt;
            col
2021-12-20  1.0
2021-12-20  NaN
2021-12-20  NaN
2021-12-21  2.0
2021-12-21  NaN
2021-12-21  NaN
2021-12-22  3.0
</code></pre>
<h1 id="인덱스나누기리샘플링-asfreq"><strong>인덱스나누기[리샘플링] (asfreq)</strong></h1>
<p><code>rule</code> : 리샘플링 할 기준 입니다. 단위로는 <code>Y, M, D, H, T(min), S ...</code> 등을 조합하여 사용할 수 있습니다.</p>
<p><code>axis</code> : 리샘플링할 축 입니다.</p>
<p><code>closed</code> : {left / right} 간격의 시작과 끝중 어느부분을 닫을지 입니다. 기본적으로 왼쪽(시작) 입니다.</p>
<p>간단히 예를들면 1분간격 인터벌로 01:00의 값이 1이라고하면 left는 시작부분을 닫아 01:00≤ x＜02:00인 시간의 값을 1으로,</p>
<p>right는 끝 부분을 닫아 00:00＜x ≤01:00인 시간의 값을 10이라고 판단하는 것입니다.</p>
<p><code>label</code> : {left / right} 리샘플링될 시간을 포함하는 간격의 어떤 가장자리를 레이블로 정할지 입니다. 기본적으로 왼쪽 입니다.</p>
<p><code>convection</code> : {start, end, s, e} PeriodIndex의 경우에만 규칙의 시작 또는 끝을 사용할지 여부를 제어합니다.</p>
<p><code>kind</code> : {timestamp / period} 결과 인덱스를 DateTimeIndex로 변환하려면 &#39;timestamp&#39;를 전달하고 PeriodIndex로 변환하려면 &#39;period&#39;를 전달합니다. <code>loffset</code> : 리샘플링된 시간 레이블을 조정하는 인수로 현재는 사용하지 않습니다. (<code>offset</code> 인수로 대체)</p>
<p><code>base</code> : 리샘플링한 데이터의 간격의 원점을 지정하는 인수로, 현재 사용하지 않습니다.(<code>origin</code> 인수로 대체)</p>
<p><code>on</code> : 인덱스가 아닌 열 기준으로 리샘플링을 시도할 경우, 해당 열의 이름을 지정하는 인수 입니다.</p>
<p><code>level</code> : 멀티인덱스(Multi Index)의 경우 리샘플링할 인덱스의 레벨을 지정하는 인수 입니다.</p>
<p><code>origin</code> : {epoch, start, start_day, end, end_day / Timestamp} 리샘플링할 경우 데이터 간격의 원점을 지정합니다.</p>
<blockquote>
<p>epoch : 1970-01-01을 기준으로 간격을 설정합니다.</p>
<p>start : 인덱스의 첫 번째 값을 기준으로 간격을 설정합니다.</p>
<p>start_day : 인덱스의 첫 번째 값이 포함되는 날의 자정을 기준으로 간격을 설정합니다.</p>
<p>end : 인덱스의 마지막 값을 기준으로 간격을 설정합니다.</p>
<p>end_day : 인덱스의 마지막 값이 포함되는 나르이 자정을 기준으로 간격을 설정합니다.</p>
<p>Timestamp : 지정한 시간(Timestamp)를 기준으로 간격을 설정합니다.</p>
</blockquote>
<p><code>offset</code> : origin의 값에 시간 오프셋을 더해줍니다.</p>
<p>먼저 기본적인 사용법 예시를위하여 10x1짜리 데이터를 만들어보겠습니다.</p>
<p><code>pd.date_range</code>를 이용해 기준시간에 대해 일정 간격을 가진 datetime index를 생성하겠습니다.</p>
<pre><code class="language-python">idx = pd.date_range(&#39;2021-12-30&#39;,periods=10,freq=&#39;min&#39;)
# 2021-12-30일기준으로 1분간격의 10개의 행 생성
df = pd.DataFrame(index=idx, data=[0,1,2,3,4,5,6,7,8,9],columns=[&#39;col&#39;])
print(df)
&gt;&gt;
                     col
2021-12-30 00:00:00    0
2021-12-30 00:01:00    1
2021-12-30 00:02:00    2
2021-12-30 00:03:00    3
2021-12-30 00:04:00    4
2021-12-30 00:05:00    5
2021-12-30 00:06:00    6
2021-12-30 00:07:00    7
2021-12-30 00:08:00    8
2021-12-30 00:09:00    9
</code></pre>
<p><code>resample</code> 메서드는 단독으로 사용하면 DatetimeIndexResampler를 출력한다 왜냐하면 우리가 원하는 데이터를 리샘플링된 데이터를 출력하고 싶으면 다른 메서드 뒤에 붙여서, 리셈플링된 데이터의 열의 값을 지정해야한다</p>
<p>우리가 원하는 리샘플링된 데이터를 출력하고자 하면, 다른 메서드를 뒤에 붙여서, 리샘플링된 데이터의 열의 값을 지정해주어야합니다.</p>
<p>1분간격으로 1~10까지의 값을 가지는 데이터를 3분(3T or 3min) 간격으로 리샘플링하면서, 값은 합치도록 해보겠습니다.</p>
<pre><code class="language-python">print(df.resample(rule=&#39;3T&#39;).sum()) # 뒤에 .sum()을 붙여주어서 합쳐질 열의 값을 더해줍니다.
&gt;&gt;
                     col
2021-12-30 00:00:00    3 #3분 간격으로 리셈플링(축소되어)되어 출력한다
2021-12-30 00:03:00   12 #col 12의 값에는 
2021-12-30 00:06:00   21 
2021-12-30 00:09:00    9 
</code></pre>
<p><code>sum()</code> 뿐만아니라 <code>prod()</code>, <code>mean()</code>등 <a href="https://wikidocs.net/151821">객체간 연산</a> 에 이용되는 모든 메서드가 가능하며,</p>
<p><code>asfreq</code>같은 메서드등도 지원합니다.</p>
<p><strong>closed인수의 사용</strong></p>
<p><code>closed</code>인수는 bin(시간 간격)을 닫는 위치를 지정하는 인수로 기본적으로 <code>left</code>값을 가집니다.</p>
<p>1분 간격 인터벌인 df값 중 <code>2021-12-30 00:03:00 3</code>의 예시를 들면, <code>left</code>인 경우는 <code>03:00≤ x ＜04:00</code>인 시간간격에 3이 부여되는 것이고,</p>
<p><code>right</code>인 경우는 <code>02:00＜ x ≤03:00</code> 인 시간 간격에 3이 부여되는 것입니다.</p>
<p>아래 예시와 그림을 보면 이해가 쉽습니다.</p>
<pre><code class="language-python"># closed=&#39;left&#39;인 경우
print(df.resample(rule=&#39;3T&#39;,closed=&#39;left&#39;).sum())
&gt;&gt;
                     col
2021-12-30 00:00:00    3
2021-12-30 00:03:00   12
2021-12-30 00:06:00   21
2021-12-30 00:09:00    9
</code></pre>
<pre><code class="language-python">Copy# closed=&#39;right&#39;인 경우
print(df.resample(rule=&#39;3T&#39;,closed=&#39;right&#39;).sum())
&gt;&gt;
                     col
2021-12-29 23:57:00    0
2021-12-30 00:00:00    6
2021-12-30 00:03:00   15
2021-12-30 00:06:00   24</code></pre>
<pre><code>left</code></pre><p>인 경우 00:00≤ x ＜03:00 인 시간대에 0,1,2가 들어가기 때문에 00:00부터 리샘플링하여 0+1+2=3 이 출력됩니다.</p>
<pre><code>right</code></pre><p>인 경우 0은 23:59:00＜ x ≤ 00:00:00인 시간대에 들어가므로 3분 단위 리샘플링이 23:57:00＜ x ≤ 00:00:00 으로 0이 출력됩니다.</p>
<p>아래 이미지를 보면 보다 직관적으로 이해할 수 있습니다.</p>
<p><strong>label 인수의 사용</strong></p>
<p><code>label</code>인수는 <code>closed</code>인수보다는 개념이 간단합니다. 단순히 리샘플링된 인덱스의 간격을 대표할 값을</p>
<p>간격의 시작값으로할지 끝 값으로할지를 지정하는 것입니다. 기본값은 <code>left</code>로 인터벌(간격)의 시작을 기준으로합니다.</p>
<pre><code class="language-python"># label = &#39;left&#39;인 경우
print(df.resample(rule=&#39;3T&#39;,label=&#39;left&#39;).sum())
&gt;&gt;
                     col
2021-12-30 00:00:00    3 # 00:00~03:00의 간격에서 시작값인 00:00을 기준으로 지정
2021-12-30 00:03:00   12
2021-12-30 00:06:00   21
2021-12-30 00:09:00    9
</code></pre>
<pre><code class="language-python"># label = &#39;right&#39;인 경우
print(df.resample(rule=&#39;3T&#39;,label=&#39;right&#39;).sum())
&gt;&gt;
                     col
2021-12-30 00:03:00    3 # 00:00~03:00의 간격에서 끝값인 03:00을 기준으로 지정
2021-12-30 00:06:00   12
2021-12-30 00:09:00   21
2021-12-30 00:12:00    9
</code></pre>
<p><strong>kind 인수의 사용</strong></p>
<p><code>kind</code> 인수는 리샘플링된 인덱스의 <code>dtype</code>을 <code>datetime</code>으로 할지 <code>peroid</code>로할지 정할 수 있습니다.</p>
<p>index의 dtype정보는 <a href="https://wikidocs.net/151193">10-10 인덱스 (index)</a> 항목에서 확인할 수 있습니다.</p>
<p><code>kind=&#39;timestamp&#39;</code>인 경우 <code>DatetimeIndex</code>가 됩니다.</p>
<pre><code class="language-python">print(df.resample(rule=&#39;3T&#39;,kind=&#39;timestamp&#39;).sum().index)
# index메서드를 통해 인덱스 정보 확인 가능
&gt;&gt;
DatetimeIndex([&#39;2021-12-30 00:00:00&#39;, &#39;2021-12-30 00:03:00&#39;,
               &#39;2021-12-30 00:06:00&#39;, &#39;2021-12-30 00:09:00&#39;],
              dtype=&#39;datetime64[ns]&#39;, freq=&#39;3T&#39;)
# 분류가 DatetimeIndex 이며 dtype=&#39;datetime`으로 설정됨.
</code></pre>
<p><code>kind=&#39;period&#39;</code>인 경우 <code>PeriodIndex</code>가 됩니다.</p>
<pre><code class="language-python">print(df.resample(rule=&#39;3T&#39;,kind=&#39;period&#39;).sum().index)
&gt;&gt;
PeriodIndex([&#39;2021-12-30 00:00&#39;, &#39;2021-12-30 00:03&#39;, &#39;2021-12-30 00:06&#39;,
             &#39;2021-12-30 00:09&#39;],
            dtype=&#39;period[3T]&#39;)
# 분류가 PeriodIndex 이며 dtype=&#39;period`로 설정됨.
</code></pre>
<p><strong>on 인수의 사용</strong></p>
<p>먼저 <code>on</code>인수의 사용을 위해 열의 값이 timestamp형태인 데이터를 만들어보겠습니다.</p>
<pre><code class="language-python">idx = pd.date_range(&#39;2021-12-30&#39;,periods=2,freq=&#39;5min&#39;)
df = pd.DataFrame(index=idx, data=[1,6],columns=[&#39;col&#39;])
# 5분간격의 2개 열을 가진 데이터 생성
df2 = df.reset_index(drop=False)
# reset_index를 통해 기존인덱스를 열로 변경, 새 인덱스는 0,1,2, ... , n으로 변경.
print(df2)
&gt;&gt;
                index  col
0 2021-12-30 00:00:00    1
1 2021-12-30 00:05:00    6
# 기존 index가 &#39;index&#39;라는 이름의 열로 바뀜
</code></pre>
<p>※ <code>reset_index</code>에 대한 자세한 내용은 <a href="https://wikidocs.net/155404">13-09 인덱스 리셋 (reset_index)</a>을 참고 바랍니다.</p>
<p><code>on=index</code>를 입력하여 index라는이름을 가진 열을 기준으로 리샘플링을 진행해보겠습니다.</p>
<pre><code class="language-python">print(df2.resample(rule=&#39;min&#39;,on=&#39;index&#39;).sum())
# 5분간격으로 2개의 값을가지는 `index`열을 1분(min) 간격으로 리샘플링.
&gt;&gt;
                     col
index
2021-12-30 00:00:00    1 # index라는 이름의 열 기준으로 리샘플링이 진행되고
2021-12-30 00:01:00    0 # 해당 열이 index로 변경됨.
2021-12-30 00:02:00    0
2021-12-30 00:03:00    0
2021-12-30 00:04:00    0
2021-12-30 00:05:00    6
</code></pre>
<p><strong>origin 인수의 사용</strong></p>
<p>먼저, <code>origin</code>인수와 <code>offset</code>인수를 사용하기 위해 3분간격의 9행짜리 Timeindex 데이터를 만들어보겠습니다.</p>
<pre><code class="language-python">idx = pd.date_range(&#39;2021-12-31&#39;,periods=9,freq=&#39;3min&#39;)
df = pd.DataFrame(index=idx, data=[1,2,3,4,5,6,7,8,9],columns=[&#39;col&#39;])
print(df)
&gt;&gt;
                     col
2021-12-31 00:00:00    1
2021-12-31 00:03:00    2
2021-12-31 00:06:00    3
2021-12-31 00:09:00    4
2021-12-31 00:12:00    5
2021-12-31 00:15:00    6
2021-12-31 00:18:00    7
2021-12-31 00:21:00    8
2021-12-31 00:24:00    9
</code></pre>
<p>이것을 7min 간격으로 리샘플링을 진행해보겠습니다.</p>
<pre><code class="language-python">print(df.resample(rule=&#39;7min&#39;).sum())
&gt;&gt;
                     col
2021-12-31 00:00:00    6
2021-12-31 00:07:00    9
2021-12-31 00:14:00   13
2021-12-31 00:21:00   17
</code></pre>
<p><code>origin</code>인수의 기본값은 start_day로 처음값이 포함된 날짜의 <strong>시작시간</strong>인 자정(00:00:00)을 기준으로 7분 간격으로 리샘플링을 진행합니다.</p>
<pre><code class="language-python">print(df.resample(rule=&#39;7min&#39;,origin=&#39;start_day&#39;).sum())
&gt;&gt;
                     col
2021-12-31 00:00:00    6
2021-12-31 00:07:00    9
2021-12-31 00:14:00   13
2021-12-31 00:21:00   17
</code></pre>
<p><code>origin=&#39;start&#39;</code>인 경우 처음 값을 기준으로 7분 간격으로 리샘플링을 진행하게됩니다.</p>
<p>여기서는 시작시간이 00:00:00이므로 <code>start_day</code>인 경우와 동일합니다.</p>
<pre><code class="language-python">print(df.resample(rule=&#39;7min&#39;,origin=&#39;start&#39;).sum())
&gt;&gt;
                     col
2021-12-31 00:00:00    6
2021-12-31 00:07:00    9
2021-12-31 00:14:00   13
2021-12-31 00:21:00   17
</code></pre>
<p><code>origin=&#39;epoch&#39;</code>인 경우 1970-01-01을 기준으로 7분 간격의 리샘플링을 하게 됩니다.</p>
<pre><code class="language-python">print(df.resample(rule=&#39;7min&#39;,origin=&#39;epoch&#39;).sum())
&gt;&gt;
                     col
2021-12-30 23:55:00    1
2021-12-31 00:02:00    5
2021-12-31 00:09:00   15
2021-12-31 00:16:00   15
2021-12-31 00:23:00    9
</code></pre>
<p><code>origin=&#39;end&#39;</code>인 경우 마지막 값을 기준으로 7분간격으로 리샘플링을 진행하게 됩니다.</p>
<pre><code class="language-python">print(df.resample(rule=&#39;7min&#39;,origin=&#39;end&#39;).sum())
&gt;&gt;
                     col
2021-12-31 00:03:00    3
2021-12-31 00:10:00    7
2021-12-31 00:17:00   11
2021-12-31 00:24:00   24
</code></pre>
<p><code>origin=&#39;end_day&#39;</code>인 경우 마지막값이 포함된 날의 <strong>끝 시간</strong>인 자정(00:00:00)을 기준으로 7분 간격의 리샘플링을 진행 합니다.</p>
<pre><code class="language-python">print(df.resample(rule=&#39;7min&#39;,origin=&#39;end_day&#39;).sum())
&gt;&gt;
                     col
2021-12-31 00:05:00    3
2021-12-31 00:12:00   12
2021-12-31 00:19:00   13
2021-12-31 00:26:00   17
</code></pre>
<p><code>origin</code>값에 특정 날짜를 입력할 경우 그 날짜(시간)을 기준으로 리샘플링이 진행됩니다.</p>
<pre><code class="language-python">print(df.resample(rule=&#39;7min&#39;,origin=&#39;2021-12-30&#39;).sum())
&gt;&gt;
                     col
2021-12-30 23:55:00    1
2021-12-31 00:02:00    5
2021-12-31 00:09:00   15
2021-12-31 00:16:00   15
2021-12-31 00:23:00    9
</code></pre>
<p><strong>offset인수의 사용</strong></p>
<p>먼저 <code>offset</code>인수를 사용하지 않은 경우를 보겠습니다.</p>
<pre><code class="language-python">print(df.resample(rule=&#39;7min&#39;).sum())
&gt;&gt;
                     col
2021-12-31 00:00:00    6
2021-12-31 00:07:00    9
2021-12-31 00:14:00   13
2021-12-31 00:21:00   17
</code></pre>
<p><code>offset</code>인수는 <code>origin</code>에 대해서 시간을 더하는 인수입니다.</p>
<p>만약 <code>offset=&#39;4min&#39;</code>을 지정해준다면, 기본값인 <code>origin=&#39;start_day&#39;</code>인 첫 값이 포함된 날의 자정(00:00:00)을 기준으로</p>
<p>4분을 더해준 값인 00:04:00을 기준으로 리샘플링이 진행되게 되는 것입니다.</p>
<p>즉, <code>origin = &#39;2021-12-31 00:04:00&#39;</code>으로 입력한 경우와 완벽히 같습니다.</p>
<pre><code class="language-python">print(df.resample(rule=&#39;7min&#39;,offset=&#39;4min&#39;).sum())
&gt;&gt;
                     col
2021-12-30 23:57:00    3 #00:04:00 기준으로 리샘플링이 진행됐기 때문에, 00:04:00에서 7min을 뺀 23:57부터 리샘플링이 진행됨.
2021-12-31 00:04:00    7
2021-12-31 00:11:00   11
2021-12-31 00:18:00   24</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-05-07]]></title>
            <link>https://velog.io/@smile_07/2025-05-07</link>
            <guid>https://velog.io/@smile_07/2025-05-07</guid>
            <pubDate>Wed, 07 May 2025 11:23:35 GMT</pubDate>
            <description><![CDATA[<h1 id="1querystrstartwith-strendwith-strcontain-filter">1.query[<strong>str.startwith, str.endwith,</strong> str.contain, filter<strong>]</strong></h1>
<h2 id="2concat">2.<strong>concat</strong></h2>
<h3 id="예시문제">예시문제</h3>
<pre><code class="language-python">data = [
    {&quot;cd&quot;:&quot;A060310&quot;, &quot;nm&quot;:&quot;3S&quot;, &quot;open&quot;:2920, &quot;close&quot;:2800},
    {&quot;cd&quot;:&quot;A095570&quot;, &quot;nm&quot;:&quot;AJ네트웍스&quot;, &quot;open&quot;:1920, &quot;close&quot;:1900},
    {&quot;cd&quot;:&quot;A006840&quot;, &quot;nm&quot;:&quot;AK홀딩스&quot;, &quot;open&quot;:2020, &quot;close&quot;:2010},
    {&quot;cd&quot;:&quot;A054620&quot;, &quot;nm&quot;:&quot;APS홀딩스&quot;, &quot;open&quot;:3120, &quot;close&quot;:3200}
]
df = DataFrame(data=data)
df = df.set_index(&#39;cd&#39;)

&gt;&gt;
             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(&quot;close &gt; open&quot;)#query문은 비교연산자를 문자열로 해도 다 알아 먹는다 이문제를 풀어서 해결하면

str = (&quot;close &gt; open&quot;)
df.query(str)

&gt;&gt;

nm    open    close
cd            
A054620    APS홀딩스    3120    3200

#위와 같이도 할 수 있다

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

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

&gt;&gt;

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

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

print(df.query(&quot;nm.str.startswith(&#39;A&#39;)&quot;))#str.startswith() 앞 글자에 xx이 포함되었는지

&gt;&gt;

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

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

---------------------------------------
data = {
    &quot;PER&quot;: [6.42, 17.63, 21.09, 13.93],
    &quot;PBR&quot;: [1.10, 1.49, 2.06, 1.88],
    &quot;DPS&quot;: [1416, 1716, 2994, 1755]
}
index = [&quot;2019/12&quot;, &quot;2020/12&quot;, &quot;2021/12&quot;, &quot;2022/12(E)&quot;]
df = pd.DataFrame(data=data, index=index)
&gt;&gt;
              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 메서드를 사용해서 &quot;PER&quot;과 &quot;PBR&quot; 컬럼만 선택하세요.

df.filter(items=[&quot;PER&quot;,&quot;PBR&quot;])

&gt;&gt;
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=&quot;P.R&quot;, axis=1)#Column에서 P,R이 포함된 걸 출력한
&gt;&gt;
    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 메서드를 사용해서 예상치인 &#39;2022/12(E)&#39;를 제외한 나머지 로우 데이터를 선택하세요.

df.filter(regex=&quot;12$&quot;, axis=0)
&gt;&gt;

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

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

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

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

columns = [&#39;open&#39;, &#39;high&#39;, &#39;low&#39;, &#39;close&#39;]
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)
&gt;&gt;

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=[&#39;open&#39;, &#39;high&#39;])
df2 = pd.DataFrame(data=np.arange(10,20).reshape(5,2), index=index, columns=[&#39;low&#39;, &#39;close&#39;])

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=[&#39;open&#39;, &#39;high&#39;, &#39;low&#39;])
df2 = pd.DataFrame(np.arange(6,12).reshape(2,3), index=index2, columns=[&#39;high&#39;, &#39;low&#39;, &#39;close&#39;])

#outer,inner를 써보
pd.concat([df1, df2], axis=0, join=&#39;outer&#39;)
&gt;&gt;

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=&#39;inner&#39;)
&gt;&gt;
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)
&gt;&gt;
0    1
0    0    1
1    2    3
0    4    5
1    6    7

#pd.concat 멀티인덱스 만들기
#예제 생성
index = [&quot;2020&quot;, &quot;2021&quot;]

data1 = {
    &quot;PER&quot;: [21.09, 13.55],
    &quot;PBR&quot;: [2.06, 1.80]
}

data2 = {
    &quot;PER&quot;: [12.40, 24.19],
    &quot;PBR&quot;: [1.58, 1.44]
}

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

        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=[&quot;삼성전자&quot;, &quot;LG전자&quot;])#keys 함수를 붙이면 자동으로 만들어진다
print(combined)

&gt;&gt;
             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=[&quot;삼성전자&quot;, &quot;LG전자&quot;])
combined.index.names = [&quot;회사&quot;, &quot;연도&quot;]
print(combined)

**&gt;&gt;

             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 = [
    [&quot;2차전지(생산)&quot;, &quot;SK이노베이션&quot;, 10.19, 1.29],
    [&quot;해운&quot;, &quot;팬오션&quot;, 21.23, 0.95],
    [&quot;시스템반도체&quot;, &quot;티엘아이&quot;, 35.97, 1.12],
    [&quot;해운&quot;, &quot;HMM&quot;, 21.52, 3.20],
    [&quot;시스템반도체&quot;, &quot;아이에이&quot;, 37.32, 3.55],
    [&quot;2차전지(생산)&quot;, &quot;LG화학&quot;, 83.06, 3.75]
]

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

&gt;&gt;**

    테마    종목명    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=&quot;테마&quot;)[[&quot;PER&quot;,&quot;PBR&quot;]].mean
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-04-21]]></title>
            <link>https://velog.io/@smile_07/2025-04-21</link>
            <guid>https://velog.io/@smile_07/2025-04-21</guid>
            <pubDate>Mon, 21 Apr 2025 11:12:27 GMT</pubDate>
            <description><![CDATA[<h1 id="공분산">공분산</h1>
<p>공분산은 두 변수가 서로 얼마나 관련이 있는지 같이 움직이는지를 보여주는 수치</p>
<h3 id="공분산-구하기">공분산 구하기</h3>
<ol>
<li>x,y 두 데이터의 평균 구하기</li>
<li>기존 데이터에 평균 데이터를 빼서 x,y의 편차 구하기</li>
<li>x편차와 y편차를 곱해서 두 값의 관계 보기</li>
<li>공분산은 편차 곱의 평균이야 그래서 구한 값들을 모두 더하고, 학생수로 나누면 돼</li>
<li>공분산이 양수 일떄는 양의 관계고 음수 일때는 음의 관계</li>
</ol>
<p>이걸 쉽게 만든게 상관관계</p>
<h3 id="상관관계">상관관계</h3>
<p>두 변수 사이의 선형적인 관계의 강도와 방향을 나타내는 수치입니다</p>
<p>보통은 r로 포현합니다</p>
<h3 id="해석-방법">해석 방법</h3>
<table>
<thead>
<tr>
<th>r 값</th>
<th>해석</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>완벽한 양의 산관관계</td>
</tr>
<tr>
<td>0.7~0.9</td>
<td>강한 양의 상관관계</td>
</tr>
<tr>
<td>0.4~0.6</td>
<td>중간 정도 양의 상관관계</td>
</tr>
<tr>
<td>0.1~0.3</td>
<td>약한 양의 상관관계</td>
</tr>
<tr>
<td>0</td>
<td>상관 없음(선형의 상관관계가 아니라는 뜻)</td>
</tr>
<tr>
<td>-0.1~-0.3</td>
<td>약한 음의 상관관계</td>
</tr>
<tr>
<td>-0.4~-0.9</td>
<td>중간 정도 음의 상관관계</td>
</tr>
<tr>
<td>-0.7~-0.9</td>
<td>강한 음의 상관관계</td>
</tr>
<tr>
<td>-1</td>
<td>완벽한 음의 상관관계</td>
</tr>
</tbody></table>
<h3 id="공분산과-차이점">공분산과 차이점</h3>
<table>
<thead>
<tr>
<th>구분</th>
<th>공분산</th>
<th>상관계수</th>
</tr>
</thead>
<tbody><tr>
<td>단위</td>
<td>데이터 단위 영향을 받음</td>
<td>단위 없음 (무차원)</td>
</tr>
<tr>
<td>범위</td>
<td>제한 없음</td>
<td>-1 ~ 1</td>
</tr>
<tr>
<td>해석</td>
<td>크기 해석 어려움</td>
<td>직관적으로 해석 쉬움</td>
</tr>
</tbody></table>
<p>y값과 x 값이 같이 올라가면 관계는 <strong>양의 상관관계(같이 움직임)</strong></p>
<p>y값이 올라가면 x값이 낮아지는 관계는 <strong>음의 상관관계다(두 가지가 반대로 움직임)</strong></p>
<p>y와 x가 전혀 관계가 없다면 <strong>상관관계는 없다</strong></p>
<h2 id="공분cov"><strong>공분(cov)</strong></h2>
<p><code>cov</code> 메서드는 결측값을 제외한 쌍별 공분산을 구하는 메서드입니다.</p>
<p>공분산이란 확률변수가 2가지 일때 얼마나 퍼져있는가를 구하는 방법입니다.</p>
<p>즉, 두 값을 X축 Y축으로 놓고 점산도를 그렸을때 퍼진 정도라고 할 수 있습니다.</p>
<p><code>min_periods</code> : 공분산을 구할 최소 요소의 갯수 입니다. 요소의 갯수가 모자르면 <code>NaN</code>을 반환합니다.</p>
<pre><code class="language-python">col = [&#39;X&#39;,&#39;Y&#39;]
data1 = [[-6,-3],[-4,-1],[-2,-3],[0,1],[2,2]]
data2 = [[7,-4],[4,-1],[2,0],[-1,3],[-4,9]]
data3 = [[3,-4],[3,-1],[3,0],[3,3],[3,9]]
df1 = pd.DataFrame(data=data1, columns=col)
df2 = pd.DataFrame(data=data2, columns=col)
df3 = pd.DataFrame(data=data3, columns=col)
</code></pre>
<h2 id="여기에-사진-첨부"><strong>여기에 사진 첨부</strong></h2>
<p><strong>기본적인 사용법</strong></p>
<p><code>df1</code>은 좌표평면상에서 x가 증가할때 y도 증가하는 경향을 가집니다.</p>
<p>이때 <code>공분산(cov)</code>값은 0보다 크며 양의 상관관계라고 합니다.</p>
<pre><code class="language-python">print(df1.cov())
&gt;&gt;
      X    Y
X  10.0  6.0
Y   6.0  5.2
</code></pre>
<p><code>df2</code>은 좌표평면상에서 x가 증가할때 y는 감소하는 경향을 가집니다.</p>
<p>이때 <code>공분산(cov)</code>값은 0보다 작으며 음의 상관관계라고 합니다.</p>
<pre><code class="language-python">print(df2.cov())
&gt;&gt;
       X      Y
X  18.30 -20.55
Y -20.55  24.30
</code></pre>
<p><code>df3</code>은 좌표평면상에서 y가 변하여도 x는 변하지 않습니다.</p>
<p>이처럼 x와 y가 상관 없는경우 <code>공분산(cov)</code>값은 0입니다.</p>
<pre><code class="language-python">print(df3.cov())
&gt;&gt;
     X     Y
X  0.0   0.0
Y  0.0  24.3
</code></pre>
<p><strong>min_periods인수의 사용</strong></p>
<p><code>min_periods</code>인수는 공분산에 이용될 요소의 최소 갯수를 제한합니다.</p>
<p>이 숫자보다 요소의 수가 적을 경우 <code>NaN</code>을 반환합니다.</p>
<pre><code class="language-python">print(df3.cov(min_periods=6))
&gt;&gt;
    X   Y
X NaN NaN
Y NaN NaN</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-04-18]]></title>
            <link>https://velog.io/@smile_07/2025-04-18</link>
            <guid>https://velog.io/@smile_07/2025-04-18</guid>
            <pubDate>Fri, 18 Apr 2025 09:54:48 GMT</pubDate>
            <description><![CDATA[<h1 id="평균절대편차-mad함수-만들기"><strong>평균절대편차 mad함수 만들기</strong></h1>
<pre><code class="language-python">!pip install pandas

import pandas as pd
from pandas import DataFrame
from pandas import Series
import numpy as np
import numba

def mad(data):

    avg = np.average(data)#데이터의 평균을 구한다
    abs_deviation = [abs(x - avg) for x in data]#abs_deviation(절대편차)를 구하는 거다 (for x in data는  0부터 훓어준다,abs(x-avg)는 절대값으로 바꿔 x에 평균값을 빼준다)
    return np.average(abs_deviation)#절대편차의 평균을 구한다

data = (2,8,0,7)
print(mad(data))
</code></pre>
<h2 id="최대최소-max--min"><strong>최대/최소 (max / min)</strong></h2>
<p><code>min / max</code> 메서드는 행/열 의 최대값, 최소값을 구하는 메서드 입니다.</p>
<p><code>axis</code> : {0 : index / 1 : columns} 계산의 기준이 될 축입니다.</p>
<p><code>skipna</code> : 결측치를 무시할지 여부입니다.</p>
<p><code>level</code> : Multi Index의 경우 연산을 수행할 레벨입니다.</p>
<p><code>numeric_only</code> : 숫자, 소수, 부울만 이용할지 여부입니다.</p>
<p><code>kwargs</code> : 함수에 전달할 추가 키워드입니다.</p>
<pre><code class="language-python">[N,T,F]=[np.NaN,True,False]
idx = [[&#39;IDX1&#39;,&#39;IDX1&#39;,&#39;IDX2&#39;,&#39;IDX2&#39;],[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]]
col = [[&#39;COL1&#39;,&#39;COL1&#39;,&#39;COL2&#39;,&#39;COL2&#39;],[&#39;val1&#39;,&#39;val2&#39;,&#39;val3&#39;,&#39;val4&#39;]]
data = [[N,13,3,4],[5,7,10,8],[15,6,N,3],[2,14,9,1]]
df = pd.DataFrame(data,idx,col)
print(df)
&gt;&gt;
           COL1       COL2
           val1 val2  val3 val4
IDX1 row1   NaN   13   3.0    4
     row2   5.0    7  10.0    8
IDX2 row3  15.0    6   NaN    3
     row4   2.0   14   9.0    1
</code></pre>
<hr>
<p><strong>기본적인 사용법(+axis)</strong></p>
<p>기본적으로 <code>df.max( ) / df.min( )</code>를 사용할 경우 모든 행/열에 대해서 최대/최소 값을 찾습니다.</p>
<pre><code class="language-python">print(df.max())
&gt;&gt;
COL1  val1    15.0
      val2    14.0
COL2  val3    10.0
      val4     8.0
dtype: float64
</code></pre>
<p><code>axis</code>를 설정해 줄 경우 축을 지정할 수 있습니다.</p>
<pre><code class="language-python">print(df.max(axis=1))
&gt;&gt;
IDX1  row1    13.0
      row2    10.0
IDX2  row3    15.0
      row4    14.0
dtype: float64
</code></pre>
<p><strong>skipna인수의 사용</strong></p>
<p><code>skipna</code>인수를 사용할 경우 계산에 대해서 결측치를 포함하거나 제외시킬 수 있습니다.</p>
<pre><code class="language-python">print(df.max(skipna=True))
&gt;&gt;
COL1  val1    15.0
      val2    14.0
COL2  val3    10.0
      val4     8.0
dtype: float64
</code></pre>
<pre><code class="language-python">print(df.max(skipna=False))
&gt;&gt;
COL1  val1     NaN
      val2    14.0
COL2  val3     NaN
      val4     8.0
dtype: float64
</code></pre>
<p><strong>level의 설정</strong></p>
<p>Multi Index의 경우 연산을 수행할 level을 지정할 수 있습니다.</p>
<pre><code class="language-python">print(df.max(level=0))
&gt;&gt;
      COL1       COL2
      val1 val2  val3 val4
IDX1   5.0   13  10.0    8
IDX2  15.0   14   9.0    3
# print(df.groupby(level=0).max()) 와 동일한 역할을 수행
</code></pre>
<p><strong>min메서드의 경우</strong></p>
<p>이 아래는 위 예시와 동일하게 <code>min</code>메서드를 수행한 경우 입니다.</p>
<pre><code class="language-python">print(df.min())
&gt;&gt;
COL1  val1    2.0
      val2    6.0
COL2  val3    3.0
      val4    1.0
dtype: float64
</code></pre>
<pre><code class="language-python">print(df.min(axis=1))
&gt;&gt;
IDX1  row1    3.0
      row2    5.0
IDX2  row3    3.0
      row4    1.0
dtype: float64
</code></pre>
<pre><code class="language-python">print(df.min(skipna=True))
&gt;&gt;
COL1  val1    2.0
      val2    6.0
COL2  val3    3.0
      val4    1.0
dtype: float64
</code></pre>
<pre><code class="language-python">print(df.min(skipna=False))
&gt;&gt;
COL1  val1    NaN
      val2    6.0
COL2  val3    NaN
      val4    1.0
dtype: float64
</code></pre>
<pre><code class="language-python">print(df.min(level=0))
&gt;&gt;
     COL1      COL2
     val1 val2 val3 val4
IDX1  5.0    7  3.0    4
IDX2  2.0    6  9.0    1
# print(df.groupby(level=0).min())와 동일</code></pre>
<h2 id="mean평균">mean(평균)</h2>
<p><code>mean</code>메서드는 행/열의 값들의 평균을 구하는 메서드입니다.</p>
<p><code>axis</code> : {0 : index / 1 : columns} 계산의 기준이 될 축입니다.</p>
<p><code>skipna</code> : 결측치를 무시할지 여부입니다.</p>
<p><code>level</code> : Multi Index의 경우 연산을 수행할 레벨입니다.</p>
<p><code>numeric_only</code> : 숫자, 소수, 부울만 이용할지 여부입니다.</p>
<p><code>kwargs</code> : 함수에 전달할 추가 키워드입니다.</p>
<pre><code class="language-python">idx = [[&#39;IDX1&#39;,&#39;IDX1&#39;,&#39;IDX2&#39;,&#39;IDX2&#39;],[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]]
col = [[&#39;COL1&#39;,&#39;COL1&#39;,&#39;COL2&#39;,&#39;COL2&#39;],[&#39;val1&#39;,&#39;val2&#39;,&#39;val3&#39;,&#39;val4&#39;]]
data = [[N,13,3,4],[5,7,10,8],[15,6,N,3],[2,14,9,1]]
df = pd.DataFrame(data,idx,col)
print(df)
&gt;&gt;
           COL1       COL2
           val1 val2  val3 val4
IDX1 row1   NaN   13   3.0    4
     row2   5.0    7  10.0    8
IDX2 row3  15.0    6   NaN    3
     row4   2.0   14   9.0    1
</code></pre>
<hr>
<p><strong>기본적인 사용법(+axis)</strong></p>
<p>기본적으로 <code>mean</code>을 그대로 사용할 경우 모든 행/열에 대해서 연산을 수행합니다.</p>
<pre><code class="language-python">print(df.mean())
&gt;&gt;
COL1  val1     7.333333
      val2    10.000000
COL2  val3     7.333333
      val4     4.000000
dtype: float64
</code></pre>
<p><code>axis</code> 인수를 이용하여 대상 축을 지정할 수 있습니다.</p>
<pre><code class="language-python">print(df.mean(axis=1))
&gt;&gt;
IDX1  row1    6.666667
      row2    7.500000
IDX2  row3    8.000000
      row4    6.500000
dtype: float64
</code></pre>
<p><strong>skipna인수의 사용</strong></p>
<p><code>skipna</code>인수를 이용하여 결측치를 무시할지 정할 수 있습니다.</p>
<pre><code class="language-python">print(df.mean(skipna=True))
&gt;&gt;
COL1  val1     7.333333
      val2    10.000000
COL2  val3     7.333333
      val4     4.000000
dtype: float64
</code></pre>
<pre><code class="language-python">print(df.mean(skipna=False))
&gt;&gt;
COL1  val1     NaN
      val2    10.0
COL2  val3     NaN
      val4     4.0
dtype: float64
</code></pre>
<p><strong>level인수의 사용</strong></p>
<p>Multi Index의 경우 대상 레벨을 지정할 수 있습니다.</p>
<pre><code class="language-python">print(df.mean(level=0))
&gt;&gt;
     COL1       COL2
     val1  val2 val3 val4
IDX1  5.0  10.0  6.5  6.0
IDX2  8.5  10.0  9.0  2.0
# print(df.groupby(level=0).mean())와 완전히 동일합니다.</code></pre>
<h2 id="중앙값-median"><strong>중앙값 (median)</strong></h2>
<p><code>median</code>메서드는 행/열의 값들의 중앙값을 구하는 메서드입니다.</p>
<p>만약 수의 갯수가 짝수이면 중앙값 두 값의 평균값을 반환합니다.</p>
<p><code>axis</code> : {0 : index / 1 : columns} 계산의 기준이 될 축입니다.</p>
<p><code>skipna</code> : 결측치를 무시할지 여부입니다.</p>
<p><code>level</code> : Multi Index의 경우 연산을 수행할 레벨입니다.</p>
<p><code>numeric_only</code> : 숫자, 소수, 부울만 이용할지 여부입니다.</p>
<p><code>kwargs</code> : 함수에 전달할 추가 키워드입니다.</p>
<pre><code class="language-python">[N,T,F]=[np.NaN,True,False]
idx = [[&#39;IDX1&#39;,&#39;IDX1&#39;,&#39;IDX2&#39;,&#39;IDX2&#39;],[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]]
col = [[&#39;COL1&#39;,&#39;COL1&#39;,&#39;COL2&#39;,&#39;COL2&#39;],[&#39;val1&#39;,&#39;val2&#39;,&#39;val3&#39;,&#39;val4&#39;]]
data = [[N,13,3,4],[5,7,10,8],[15,6,N,3],[2,14,9,1]]
df = pd.DataFrame(data,idx,col)
print(df)
&gt;&gt;
           COL1       COL2
           val1 val2  val3 val4
IDX1 row1   NaN   13   3.0    4
     row2   5.0    7  10.0    8
IDX2 row3  15.0    6   NaN    3
     row4   2.0   14   9.0    1
</code></pre>
<hr>
<p><strong>기본적인 사용법(+axis)</strong></p>
<p>기본적으로 <code>median</code>을 그대로 사용할 경우 모든 행/열에 대해서 연산을 수행합니다.</p>
<p>만약 수의 갯수가 짝수이면 중앙값 두 값의 평균값을 반환합니다.</p>
<pre><code class="language-python">print(df.median())
&gt;&gt;
COL1  val1     5.0 # 2, 5, 15의 중앙값인 5
      val2    10.0 # 6, 7, 13, 14 의 중앙값은 7과 13의 평균인 10
COL2  val3     9.0
      val4     3.5
dtype: float64
</code></pre>
<p><code>axis</code> 인수를 이용하여 대상 축을 지정할 수 있습니다.</p>
<pre><code class="language-python">print(df.median(axis=1))
&gt;&gt;
IDX1  row1    4.0
      row2    7.5
IDX2  row3    6.0
      row4    5.5
dtype: float64
</code></pre>
<p><strong>skipna인수의 사용</strong></p>
<p><code>skipna</code>인수를 이용하여 결측치를 무시할지 정할 수 있습니다.</p>
<pre><code class="language-python">print(df.median(skipna=True))
&gt;&gt;
COL1  val1     5.0
      val2    10.0
COL2  val3     9.0
      val4     3.5
dtype: float64
</code></pre>
<pre><code class="language-python">print(df.median(skipna=False))
&gt;&gt;
COL1  val1     NaN
      val2    10.0
COL2  val3     NaN
      val4     3.5
dtype: float64
</code></pre>
<p><strong>level인수의 사용</strong></p>
<p>Multi Index의 경우 대상 레벨을 지정할 수 있습니다.</p>
<pre><code class="language-python">print(df.groupby(level=0).median())
&gt;&gt;
     COL1       COL2
     val1  val2 val3 val4
IDX1  5.0  10.0  6.5  6.0
IDX2  8.5  10.0  9.0  2.0
</code></pre>
<h2 id="최빈값-mode"><strong>최빈값 (mode)</strong></h2>
<p><code>mode</code>메서드는 대상 행/열의 최빈값을 구하는 메서드입니다.</p>
<p>최빈값이 여러개일 경우 모두 표시합니다.</p>
<p><code>axis</code> : {0 : index / 1 : columns} 최빈값을 구할 축 입니다.</p>
<p><code>numeric_only</code> : <code>True</code>일 경우 숫자, 소수, 부울값만 있는 열에대해서만 연산을 수행합니다.</p>
<p><code>dropna</code> : 결측치를 계산에서 제외할지 여부입니다. <code>False</code>일 경우 결측치도 계산에 포함됩니다.</p>
<pre><code class="language-python">[N,T,F]=[np.NaN,True,False]
idx = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;]
data = [[&#39;A&#39;,2,&#39;x&#39;,N],[&#39;B&#39;,2,&#39;y&#39;,N],[&#39;C&#39;,1,&#39;y&#39;,1],[&#39;A&#39;,N,&#39;z&#39;,3]]
df = pd.DataFrame(data,idx,col)
print(df)
&gt;&gt;
     col1  col2 col3  col4
row1    A   2.0    x   NaN
row2    B   2.0    y   NaN
row3    C   1.0    y   1.0
row4    A   NaN    z   3.0
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p><code>mode</code>메서드를 사용하면 각 열에 대해서 최빈값이 인덱스 0에 출력됩니다.</p>
<p>만약 최빈값이 여러개일 경우 갯수만큼 인덱스가 생성되어 출력됩니다.</p>
<p>이 때, 최빈값 이외의 값은 <code>NaN</code>을 출력합니다.</p>
<pre><code class="language-python">print(df.mode())
&gt;&gt;
  col1  col2 col3  col4
0    A   2.0    y   1.0
1  NaN   NaN  NaN   3.0
# col4의 최빈값이 1과 3으로 두개이기 때문에 두개 다 출력, 나머지는 최빈값이
# 하나이므로 1행에는 NaN출력
</code></pre>
<p><strong>dropna인수의 사용</strong></p>
<p>기본적으로 결측치는 최빈값 계산에서 제외됩니다. <code>dropna= True</code>로 할 경우 결측치도 계산에 포함되며,</p>
<p>결측치가 제일 많을 경우 최빈값은 결측치가 됩니다.</p>
<pre><code class="language-python">print(df.mode(dropna=False))
&gt;&gt;
  col1  col2 col3  col4
0    A   2.0    y   NaN
# col4에는 NaN이 가장 많으므로 최빈값이 NaN으로 계산됨.
</code></pre>
<p><strong>numeric_only인수의 사용</strong></p>
<p><code>numeric_only</code>인수가 <code>True</code>인 경우 숫자 or bool형태가 아닌 자료형을 갖는 열은 계산에서 제외됩니다.</p>
<pre><code class="language-python">Copyprint(df.mode(numeric_only=True))
&gt;&gt;
   col2  col4
0   2.0   1.0
1   NaN   3.0
# col1, col3에는 문자열 형식이 존재하므로 계산에서 제외됨.</code></pre>
<h2 id="표준편차-std"><strong>표준편차 (std)</strong></h2>
<p><code>std</code> 메서드는 행/열에 대한 <code>표본표준편차</code>를 구하는 메서드입니다.</p>
<p>※ 모표준편차가 아니라 표본표준편차입니다.</p>
<ul>
<li><p><em>※ ※ 후술할 ddof=0 일 경우 자유도가 n이므로 모표준편차로 계산이 가능합니다 *</em>모표준편차표본표준편차</p>
<p>  σ(모표준편차)=Σ|x−μ|2ns(표본표준편차)=Σ|x−μ|2n−ddof</p>
</li>
</ul>
<p><code>axis</code> : 표본표준편차를 구할 축을 지정합니다.</p>
<p><code>skipna</code> : 결측치를 무시할지 여부입니다.</p>
<p><code>level</code> : Multi Index의 경우 대상 레벨을 지정할 수 있습니다.</p>
<p><code>ddof</code> : 표본표준편차 계산의 분모가되는 자유도를 지정합니다. 산식은 <code>n - ddof값</code>으로 기본값은 <code>n-1</code>입니다.</p>
<p><code>numeric_only</code> : 숫자, 소수, bool로 구성된 열만 대상으로할지 여부입니다.</p>
<p><code>kwargs</code> : 함수의 경우에 추가적으로 적용할 키워드입니다.</p>
<pre><code class="language-python">[N,T,F]=[np.NaN,True,False]
idx = [[&#39;IDX1&#39;,&#39;IDX1&#39;,&#39;IDX2&#39;,&#39;IDX2&#39;],[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;]
data = [[1,5,7,13],[5,2,19,1],[13,6,4,12],[8,N,0,8]]
df = pd.DataFrame(data,idx,col)
print(df)
&gt;&gt;
           col1  col2  col3  col4
IDX1 row1     1   5.0     7    13
     row2     5   2.0    19     1
IDX2 row3    13   6.0     4    12
     row4     8   NaN     0     8
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p>인수입력 없이 <code>std</code>메서드를 사용할 경우 각 열의 요소들의 표본표준편차를 계산합니다.</p>
<pre><code class="language-python">print(df.std())
&gt;&gt;
col1    5.057997
col2    2.081666
col3    8.185353
col4    5.446712
dtype: float64
</code></pre>
<p><strong>skipna인수의 사용</strong></p>
<p><code>skipna=False</code>인 경우 결측값이 포함된 경우 <code>NaN</code>을 출력합니다.</p>
<pre><code class="language-python">print(df.std(skipna=False))
&gt;&gt;
col1    5.057997
col2         NaN
col3    8.185353
col4    5.446712
dtype: float64
</code></pre>
<p><strong>axis인수의 사용</strong></p>
<p><code>axis</code> 인수를 통해 계산의 대상이 될 축을 지정할 수 있습니다.</p>
<pre><code class="language-python">print(df.std(axis=1))
&gt;&gt;
IDX1  row1    5.000000
      row2    8.341663
IDX2  row3    4.425306
      row4    4.618802
dtype: float64
</code></pre>
<p><strong>level인수의 사용</strong></p>
<p>Multi Index의 경우 <code>level</code> 인수를 이용해 레벨을 지정할 수 있습니다.</p>
<pre><code class="language-python">print(df.std(level=0))
&gt;&gt;
          col1     col2      col3      col4
IDX1  2.828427  2.12132  8.485281  8.485281
IDX2  3.535534      NaN  2.828427  2.828427
</code></pre>
<pre><code class="language-python">print(df.std())
&gt;&gt;
col1    5.057997
col2    2.081666
col3    8.185353
col4    5.446712
dtype: float64
</code></pre>
<pre><code class="language-python">print(df.std(ddof=2))
&gt;&gt;
col1     6.194756
col2     2.943920
col3    10.024969
col4     6.670832
dtype: float64
</code></pre>
<pre><code class="language-python">print(df.std(ddof=3))
&gt;&gt;
col1     8.760708
col2          NaN
col3    14.177447
col4     9.433981
dtype: float64
</code></pre>
<pre><code class="language-python">print(df.std(ddof=4))
&gt;&gt;
col1   NaN
col2   NaN
col3   NaN
col4   NaN분산 (var)</code></pre>
<h2 id="분산var">분산(var)</h2>
<p><code>var</code> 메서드는 행/열에 대한 <code>불편향분산</code>를 구하는 메서드입니다.</p>
<p>※ 모분산이 아니라 불편향분산을 구하는 메서드입니다. 불편향 메서드란 분모에 n이 아닌 n-1나누는 기대값을 적용해 편향을 제거한 분산입니다.</p>
<ul>
<li><p><em>※ ※ 후술할 ddof=0 일 경우 자유도가 n이므로 모분산으로 계산이 가능합니다 *</em>모분산불편향분산</p>
<p>  σ2(모분산)=Σ|x−μ|2nS2(불편향분산)=Σ|x−μ|2n−ddof</p>
</li>
</ul>
<p><code>axis</code> : 불편향분산을 구할 축을 지정합니다.</p>
<p><code>skipna</code> : 결측치를 무시할지 여부입니다.</p>
<p><code>level</code> : Multi Index의 경우 대상 레벨을 지정할 수 있습니다.</p>
<p><code>ddof</code> : 불편향분산 계산의 분모가되는 자유도를 지정합니다. 산식은 <code>n - ddof값</code>으로 기본값은 <code>n-1</code>입니다.</p>
<p><code>numeric_only</code> : 숫자, 소수, bool로 구성된 열만 대상으로할지 여부입니다.</p>
<p><code>kwargs</code> : 함수의 경우에 추가적으로 적용할 키워드입니다.</p>
<p>먼저 기본적인 사용법 예시를 위해 4x4짜리 Multi Index 객체를 생성하겠습니다.</p>
<pre><code class="language-python">[N,T,F]=[np.NaN,True,False]
idx = [[&#39;IDX1&#39;,&#39;IDX1&#39;,&#39;IDX2&#39;,&#39;IDX2&#39;],[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;]
data = [[1,5,7,13],[5,2,19,1],[13,6,4,12],[8,N,0,8]]
df = pd.DataFrame(data,idx,col)
print(df)
&gt;&gt;
           col1  col2  col3  col4
IDX1 row1     1   5.0     7    13
     row2     5   2.0    19     1
IDX2 row3    13   6.0     4    12
     row4     8   NaN     0     8
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p>인수입력 없이 <code>var</code>메서드를 사용할 경우 각 열의 요소들의 불편향분산을 계산합니다.</p>
<pre><code class="language-python">int(df.var())
&gt;&gt;
col1    25.583333
col2     4.333333
col3    67.000000
col4    29.666667
dtype: float64
</code></pre>
<p><strong>skipna인수의 사용</strong></p>
<p><code>skipna=False</code>인 경우 결측값이 포함된 경우 <code>NaN</code>을 출력합니다.</p>
<pre><code class="language-python">print(df.var(skipna=False))
&gt;&gt;
col1    25.583333
col2          NaN
col3    67.000000
col4    29.666667
dtype: float64
</code></pre>
<p><strong>axis인수의 사용</strong></p>
<p><code>axis</code> 인수를 통해 계산의 대상이 될 축을 지정할 수 있습니다.</p>
<pre><code class="language-python">print(df.var(axis=1))
&gt;&gt;

IDX1  row1    25.000000
      row2    69.583333
IDX2  row3    19.583333
      row4    21.333333
dtype: float64
</code></pre>
<p><strong>level인수의 사용</strong></p>
<p>Multi Index의 경우 <code>level</code> 인수를 이용해 레벨을 지정할 수 있습니다.</p>
<pre><code class="language-python">print(df.groupby(level=0).var())
&gt;&gt;
      col1  col2  col3  col4
IDX1   8.0   4.5  72.0  72.0
IDX2  12.5   NaN   8.0   8.0</code></pre>
<h2 id="누적-최대최소-cummax--cummin"><strong>누적 최대/최소 (cummax / cummin)</strong></h2>
<p><code>cummax / cummin</code>메서드는 행/열의 누적 최대값/최소값을 구하는 메서드입니다.</p>
<p>위에서부터 아래로 한줄씩 검사하여 해당 행/열 까지의 값중 최대/최소값을 반환합니다.</p>
<p><code>axis</code> : 누적 최대/최소값을 구할 축을 지정합니다.</p>
<p><code>skipna</code> : 결측치를 무시할지 여부 입니다</p>
<pre><code class="language-python">[N,T,F]=[np.NaN,True,False]
df = pd.DataFrame({&#39;col1&#39;:[1,-2,5,3,0,7],&#39;col2&#39;:[3,4,N,9,2,5]})
print(df)
&gt;&gt;
   col1  col2
0     1   3.0
1    -2   4.0
2     5   NaN
3     3   9.0
4     0   2.0
5     7   5.0
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p><code>cummax / cummin</code>을 사용할 경우 해당 행/열 까지의 값중 최대/최소값을 반환합니다.</p>
<pre><code class="language-python">print(df.cummax())
&gt;&gt;
   col1  col2
0     1   3.0
1     1   4.0
2     5   NaN # col1에서 최대값 5발생
3     5   9.0 # col2에서 최대값 9발생
4     5   9.0
5     7   9.0 # col1에서 최대값7 발생
</code></pre>
<pre><code class="language-python">print(df.cummin())
&gt;&gt;
   col1  col2
0     1   3.0
1    -2   3.0 # col1에서 최소값 -2발생
2    -2   NaN
3    -2   3.0
4    -2   2.0 # col2에서 최소값 2 발생
5    -2   2.0
</code></pre>
<p><strong>skipna 인수의 사용</strong></p>
<p><code>skipna=False</code>일 경우 결측값이 발생하면 최대/최소값을 결측값으로 반환하게됩니다.</p>
<pre><code class="language-python">print(df.cummax(skipna=False))
&gt;&gt;
   col1  col2
0     1   3.0
1     1   4.0
2     5   NaN # col2에서 결측값 발생
3     5   NaN
4     5   NaN
5     7   NaN
#결측값이 반환되면 쭉 반환된</code></pre>
<h2 id="분위수-quantile"><strong>분위수 (quantile)</strong></h2>
<p><code>cumsum / cumprod</code>메서드는 행/열의 누적합/누적곱을 구하는 메서드입니다.</p>
<p>위에서부터 아래로 한줄씩 덧셈/곱셈을 누적하여 수행합니다.</p>
<p><code>axis</code> : 누적합/누적곱을 구할 축을 지정합니다.</p>
<p><code>skipna</code> : 결측치를 무시할지 여부 입니다</p>
<p><code>quantile</code>메서드는 해당 행/열의 분위수의 해당하는 값을 반환하는 메서드입니다.</p>
<h2 id="사용법"><strong>사용법</strong></h2>
<p><strong>기본 사용법</strong></p>
<p>※ 자세한 내용은 아래 예시를 참고 바랍니다.</p>
<p>df.quantile(q=0.5, axis=0, numeric_only=True, interpolation=&#39;linear&#39;)</p>
<p><code>q</code> : 분위수 입니다. 소수로 표현합니다. (예 : 75% = 0.75)</p>
<p><code>aixs</code> : 분위수의 값을 구할 축입니다.</p>
<p><code>numeric_only</code> : 수(소수)만 대상으로할지 여부입니다. <code>False</code>일 경우 datetime 및 timedelta 데이터의 분위수도 계산됩니다.</p>
<p><code>interpolation</code> : 분위수에 값이 없을때 보간하는 방법입니다. 방식은 아래와 같습니다.</p>
<blockquote>
<p>liner : i + (j - i) x 비율 [분위수 앞, 뒤 수 간격 * 비율]</p>
<p>lower : i [분위수 앞, 뒤수 중 작은수]</p>
<p>higher : j [분위수 앞, 뒤수 중 큰수]</p>
<p>midpoint : (i+j)÷2 [분위수 앞, 뒤수의 중간값]</p>
<p>nearest : i or j [분위수 앞, 뒤수중 분위수에 가까운 수]</p>
</blockquote>
<h2 id="예시"><strong>예시</strong></h2>
<p>먼저 기본적인 사용법 예시를 위해 3x3짜리 객체를 생성하겠습니다.</p>
<pre><code class="language-python">idx = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
data= [[0,1,32],[50,10,-9],[100,100,18]]

df = pd.DataFrame(data,idx,col)
print(df)
&gt;&gt;
      col1  col2  col3
row1     0     1    32
row2    50    10    -9
row3   100   100    18
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p><code>q</code>의 값에 따라 해당 분위수를 출력하게 됩니다.</p>
<p>0분위수의 경우</p>
<pre><code class="language-python">print(df.quantile(q=0))
# 0분위수인 가장 작은수를 출력
&gt;&gt;
col1    0.0
col2    1.0
col3   -9.0
Name: 0.0, dtype: float64
</code></pre>
<p>0.5분위수의 경우</p>
<pre><code class="language-python">print(df.quantile(q=0.5))
# 0.5분위수인 중간값을 출력
&gt;&gt;
col1    50.0
col2    10.0
col3    18.0
Name: 0.5, dtype: float64
</code></pre>
<p>1분위수의 경우</p>
<pre><code class="language-python">print(df.quantile(q=1))
# 1분위수인 가장 큰 값 출력
&gt;&gt;
col1    100.0
col2    100.0
col3     32.0
Name: 1.0, dtype: float64
</code></pre>
<p><strong>interpolation인수의 사용</strong></p>
<p><code>interpolation</code>은 분위수의 해당하는 값이 없는 경우 어떤 수를 출력할지 정하는 보간법입니다.</p>
<p><code>linear</code>의 경우 <code>i + (j - i) x 비율</code>입니다.</p>
<pre><code class="language-python">print(df.quantile(q=0.75, interpolation=&#39;linear&#39;))
&gt;&gt;
col1    75.0
col2    55.0
col3    25.0
Name: 0.75, dtype: float64
</code></pre>
<p><code>lower</code>의 경우 <code>i [분위수 앞, 뒤수 중 작은수]</code> 입니다.</p>
<pre><code class="language-python">print(df.quantile(q=0.75, interpolation=&#39;lower&#39;))
&gt;&gt;
col1    50
col2    10
col3    18
Name: 0.75, dtype: int64
</code></pre>
<p><code>higher</code>의 경우 <code>j [분위수 앞, 뒤수 중 큰수]</code> 입니다.</p>
<pre><code class="language-python">col1    100
col2    100
col3     32
Name: 0.75, dtype: int64
</code></pre>
<p><code>midpoint</code>의 경우 <code>(i+j)÷2 [분위수 앞, 뒤수의 중간값]</code> 입니다.</p>
<pre><code class="language-python">print(df.quantile(q=0.75, interpolation=&#39;midpoint&#39;))
&gt;&gt;
col1    75.0
col2    55.0
col3    25.0
Name: 0.75, dtype: float64
</code></pre>
<p><code>nearest</code>의 경우 <code>i or j [분위수 앞, 뒤수중 분위수에 가까운 수]</code> 입니다.</p>
<pre><code class="language-python">print(df.quantile(q=0.75, interpolation=&#39;nearest&#39;))
&gt;&gt;
col1    100
col2    100
col3     32
Name: 0.75, dtype: int64</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-04-17]]></title>
            <link>https://velog.io/@smile_07/2025-04-17</link>
            <guid>https://velog.io/@smile_07/2025-04-17</guid>
            <pubDate>Thu, 17 Apr 2025 10:57:58 GMT</pubDate>
            <description><![CDATA[<h2 id="행↔열-교환-swapaxes"><strong>행↔열 교환 (swapaxes)</strong></h2>
<p><code>swapaxes</code>메서드는 행/열을 바꿔주는 메서드입니다. 값들도 교환됩니다.</p>
<p><code>axis1</code>, <code>axis2</code> : {0 : index / 1 : columns} 교환할 행과 열 입니다.</p>
<p><code>copy</code> : 사본을 생성할지 여부입니다.</p>
<pre><code class="language-python">idx = [&#39;row1&#39;,&#39;row2&#39;]
col = [&#39;col1&#39;,&#39;col2&#39;]
data= [[&#39;A&#39;,&#39;B&#39;],[1,2]]
df = pd.DataFrame(data, idx, col)
print(df)</code></pre>
<p><code>axis1</code>과 <code>axis2</code>에 행/열을 지정하여 교환할 수 있습니다. 행&lt;-&gt;열 교환이나 열&lt;-&gt;행 교환이나 완벽히 동일합니다.</p>
<pre><code class="language-python">print(df.swapaxes(axis1=0,axis2=1))
&gt;&gt;
     row1 row2
col1    A    1
col2    B    2
</code></pre>
<p><code>axis1</code>과 <code>axis2</code>이 같다면, 당연히 원래 값과 같습니다.</p>
<pre><code class="language-python">print(df.swapaxes(axis1=1,axis2=1))
&gt;&gt;
     col1 col2
row1    A    B
row2    1    2</code></pre>
<h2 id="레이블명-변경-rename"><strong>레이블명 변경 (rename)</strong></h2>
<p><code>rename</code> 메서드는 레이블의 이름을 변경하는 메서드 입니다.</p>
<p><code>mapper</code> : 변경할 {레이블명 : 값} 입니다. <code>dict</code>나 <code>함수</code>형태가 올 수 있는데, 축이 지정되어있지 않으므로 <code>axis</code>인수와 함께 사용해야 합니다.</p>
<p><code>axis</code> : <code>mapper</code>의 변경값이 적용될 축 입니다.</p>
<p><code>index</code>, <code>columns</code> : 변경할 {레이블명 : 값}입니다. 미리 축을 지정하기 때문에 <code>axis</code>인수와 병행사용할 수 없습니다.</p>
<p><code>copy</code> : 사본을 생성할지 여부입니다.</p>
<p><code>inplace</code> : Pandas 공통 인수인 <code>inplace</code>는 원본을 수정할지의 여부를 지정합니다.</p>
<p><code>level</code> : Multi Index의 경우 레벨을 지정해줍니다.</p>
<p><code>errors</code> : {&#39;ignore&#39; / &#39;raise&#39;} <code>mapper</code>, <code>index</code>, <code>columns</code>에서 지정한 <code>dict</code>에 해당하는 <code>key</code>값이 없을경우, 오류를 발생시킬지 여부 입니다.</p>
<pre><code class="language-python">data= [[&#39;-&#39;,&#39;-&#39;],[&#39;-&#39;,&#39;-&#39;]]
df1 = pd.DataFrame(data)
print(df1)
&gt;&gt;
   0  1
0  -  -
1  -  -
</code></pre>
<hr>
<p><strong>mapper와 axis를 이용하는 방법</strong></p>
<p><code>mapper</code>를 이용해 변경 내용을 설정해준 경우, <code>axis</code>인수를 이용해 적용 축을 설정해주어야합니다.</p>
<pre><code class="language-python">
print(df1.rename(mapper={0:&#39;col1&#39;,1:&#39;col2&#39;}, axis=1))
&gt;&gt;
# mapper를 통해 0을 col1로, 1을 col2로 설정하고 축을 열(1:columns)로 설정
  col1 col2
0    -    -
1    -    -
</code></pre>
<p><strong>index나 columns를 이용하는 방법</strong></p>
<p><code>index</code>나 <code>columns</code>에 변경 내용을 설정해주는 경우 <code>axis</code>설정 없이 적용이 됩니다.</p>
<pre><code class="language-python"># index에 변경값을 입력
print(df1.rename(index = {0:&#39;row1&#39;,1:&#39;row2&#39;}))
#인덱스의 0번째와 1번째 인덱스 변경
&gt;&gt;
      0  1
row1  -  -
row2  -  -
</code></pre>
<p><strong>inplace인수를 이용한 원본 변경</strong></p>
<p>pandas 공통사항으로 <code>inplace=True</code>인 경우 원본의 값이 변경됩니다.</p>
<pre><code class="language-python">df1.rename(index={0:&#39;row1&#39;,1:&#39;row2&#39;}, columns={0:&#39;col1&#39;,1:&#39;col2&#39;},inplace=True)
print(df1)
&gt;&gt;
     col1 col2
row1    -    -
row2    -    -
</code></pre>
<h3 id="multi-index의-경우"><strong>Multi Index의 경우</strong></h3>
<hr>
<p>먼저 예시를 위한 Multi Index를 만들어 보겠습니다</p>
<pre><code class="language-python">idx = [[&#39;row1&#39;,&#39;row1&#39;,&#39;row2&#39;,&#39;row2&#39;],[1,2,3,4]]
col = [&#39;col1&#39;,&#39;col2&#39;]
data = [[&#39;-&#39;,&#39;-&#39;],[&#39;-&#39;,&#39;-&#39;],[&#39;-&#39;,&#39;-&#39;],[&#39;-&#39;,&#39;-&#39;]]
df2 = pd.DataFrame(data, idx, col)
print(df2)
&gt;&gt;
       col1 col2
row1 1    -    -
     2    -    -
row2 3    -    -
     4    -    -
</code></pre>
<hr>
<p><strong>level의 지정</strong></p>
<p>Multi Index의 경우 <code>rename</code>으로 레이블명을 변경할 경우 <code>level</code>을 통해 레벨을 설정해주어야 합니다.</p>
<pre><code class="language-python">print(df2.rename(level=1, index={1:&#39;val1&#39;,2:&#39;val2&#39;,3:&#39;val3&#39;,4:&#39;val4&#39;,5:&#39;val5&#39;}))
&gt;&gt;
          col1 col2
row1 val1    -    -
     val2    -    -
row2 val3    -    -
     val4    -    -
</code></pre>
<p>레벨1 의 인덱스가 변경된 것을 확인할 수 있습니다. 그런데 <code>{ ... , 5:&#39;val5&#39;}</code>는 존재하지 않는 인덱스인데, 오류가 발생하지 않았습니다.</p>
<p>이는 <code>errors</code>인수를 통해 오류 발생이 가능합니다.</p>
<p><strong>errors인수의 사용</strong></p>
<p><code>errors</code>는 기본적으로 <code>ignore</code>으로 존재하지 않은 인덱스에 대해 <code>dict</code>를 입력하더라도 오류를 발생시키지 않습니다.</p>
<p>위의 예시를 <code>errors=&#39;raise&#39;</code>를 이용하여 다시 실행해보겠습니다.</p>
<pre><code class="language-python">print(df2.rename(errors=&#39;raise&#39;,level=1, index={1:&#39;val1&#39;,2:&#39;val2&#39;,3:&#39;val3&#39;,4:&#39;val4&#39;,5:&#39;val5&#39;}))
&gt;&gt;
오류 발생
KeyError: &#39;[1, 2, 3, 4, 5] not found in axis&#39;</code></pre>
<h2 id="축-이름-변경-rename_axis"><strong>축 이름 변경 (rename_axis)</strong></h2>
<p><code>rename_axis</code>메서드는 축의 이름을 지정하는 메서드입니다.</p>
<p><code>mapper</code> : 변경할 값 입니다. <code>dict</code>나 <code>함수</code>, <code>스칼라</code>형태가 올 수 있는데, 축이 지정되어있지 않으므로 <code>axis</code>인수와 함께 사용해야 합니다.</p>
<p><code>axis</code> : <code>mapper</code>의 변경값이 적용될 축 입니다.</p>
<p><code>index</code>, <code>columns</code> : 변경할 축을 지정해서 값을 변경합니다.</p>
<p><code>copy</code> : 사본을 생성할지 여부입니다.</p>
<p><code>inplace</code> : Pandas 공통 인수인 <code>inplace</code>는 원본을 수정할지의 여부를 지정합니다.</p>
<pre><code class="language-python">df = pd.DataFrame(data=[[&#39;-&#39;,&#39;-&#39;],[&#39;-&#39;,&#39;-&#39;]],index=[&#39;row1&#39;,&#39;row2&#39;],columns=[&#39;col1&#39;,&#39;col2&#39;])
print(df)
&gt;&gt;
     col1 col2
row1    -    -
row2    -    -
</code></pre>
<hr>
<p><strong>mapper와 axis를 이용하는 방법</strong></p>
<p><code>mapper</code>를 통해 변경값을 지정해주는 경우 <code>axis</code>를 통해 적용될 축을 지정해주어야 합니다.</p>
<pre><code class="language-python">df = df.rename_axis(mapper=&#39;index&#39;,axis=0)
#index라는 행의 축을 추가한다
print(df)

&gt;&gt;
      col1 col2
index
row1     -    -
row2     -    -
</code></pre>
<p><strong>index나 columns를 이용하는 경우</strong></p>
<p><code>index</code>나 <code>columns</code>에 값을 지정해주는경우 별도의 축을 지정해줄 필요가 없습니다.</p>
<pre><code class="language-python">df = df.rename_axis(columns=&#39;columns&#39;)
print(df)
&gt;&gt;
columns col1 col2
index
row1       -    -
row2       -    -
</code></pre>
<p><strong>inplace의 사용</strong></p>
<p>pandas 공통사항으로 <code>inplace=True</code>인 경우 원본을 변경하게 됩니다. 지정해준 축 이름을 대문자로 변경하는 함수와 함께 <code>inplace</code>를 사용해보겠습니다.</p>
<pre><code class="language-python">df.rename_axis(index=str.upper, columns=str.upper, inplace=True)
print(df)
&gt;&gt;
COLUMNS col1 col2
INDEX
row1       -    -
row2       -    -</code></pre>
<h2 id="레이블명-변경-set_axis"><strong>레이블명 변경 (set_axis)</strong></h2>
<p><code>set_axis</code>메서드는 레이블명을 원하는 값으로 변경하는 메서드입니다.</p>
<p><code>labels</code> : 변경할 이름입니다. <code>list</code>형태로 사용 가능합니다.</p>
<p><code>axis</code> : {0 : index / 1 : columns} 변경값을 적용할 축 입니다.</p>
<p><code>inplace</code> : pandas 공통인수인 <code>inplace</code>는 <code>True</code>인 경우 원본을 변경하게 됩니다.</p>
<pre><code class="language-python">df = pd.DataFrame(data=[[1,2],[3,4]])
print(df)
&gt;&gt;
   0  1
0  1  2
1  3  4
</code></pre>
<hr>
<p><code>labels</code>에 변경할 값을 입력하고, <code>axis</code>를 통해 축을 설정해주어서 레이블명을 변경할 수 있습니다.</p>
<pre><code class="language-python">df=df.set_axis(labels=[&#39;row1&#39;,&#39;row2&#39;],axis=0)
#행 레이블 변경
print(df)
&gt;&gt;
      0  1
row1  1  2
row2  3  4
</code></pre>
<pre><code class="language-python">df = df.set_axis(labels=[&#39;col1&#39;,&#39;col2&#39;],axis=1)
#열 레이블 변경
print(df)
&gt;&gt;
      col1  col2
row1     1     2
row2     3     4
</code></pre>
<h2 id="열을-인덱스로-설정-set_index"><strong>열을 인덱스로 설정 (set_index)</strong></h2>
<p><code>set_index</code>메서드는 기존의 열을 인덱스로 설정하는 메서드입니다.</p>
<p><code>keys</code> : 인덱스로 설정할 열의 이름입니다. <code>list</code>형태로 설정할 경우 Multi Index로 설정됩니다.</p>
<p><code>drop</code> : 인덱스로 설정한 열을 기존 열에서 제거할지 여부입니다. 기본값은 <code>True</code>로 열에서 제거됩니다.</p>
<p><code>append</code> : 기존 인덱스를 유지하면서 새 인덱스를 추가할 지 여부입니다.</p>
<p><code>inplace</code> : pandas 공통 인수로 원본을 대체할지 여부입니다.</p>
<p><code>verify_integrity</code> : 추가하려는 인덱스에 중복값이 있을경우 오류를 띄울지 여부 입니다.</p>
<pre><code class="language-python">data={&#39;col1&#39;:[&#39;A&#39;,&#39;A&#39;,&#39;A&#39;,&#39;B&#39;,&#39;B&#39;],
      &#39;col2&#39;:[&#39;[1]&#39;,&#39;[2]&#39;,&#39;[3]&#39;,&#39;[1]&#39;,&#39;[2]&#39;],
      &#39;col3&#39;:[2,5,3,4,1],
      &#39;col4&#39;:[&#39;X&#39;,&#39;X&#39;,&#39;Y&#39;,&#39;Z&#39;,&#39;Z&#39;]}
idx=[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;,&#39;row5&#39;]
df = pd.DataFrame(data=data,index=idx)
print(df)
&gt;&gt;
     col1 col2  col3 col4
row1    A  [1]     2    X
row2    A  [2]     5    X
row3    A  [3]     3    Y
row4    B  [1]     4    Z
row5    B  [2]     1    Z
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p><code>keys</code>로 인덱스가 될 열 이름을 지정할 수 있습니다.</p>
<pre><code class="language-python"># col1을 인덱스로 만들기
print(df.set_index(keys=&#39;col1&#39;))
&gt;&gt;
     col2  col3 col4
col1
A     [1]     2    X
A     [2]     5    X
A     [3]     3    Y
B     [1]     4    Z
B     [2]     1    Z
</code></pre>
<p><code>keys</code>에 <code>list</code>가 입력될 경우 Multi Index 형태로 설정이 됩니다.</p>
<pre><code class="language-python">print(df.set_index(keys=[&#39;col1&#39;,&#39;col2&#39;]))
&gt;&gt;
           col3 col4
col1 col2
A    [1]      2    X
     [2]      5    X
     [3]      3    Y
B    [1]      4    Z
     [2]      1    Z
</code></pre>
<p><strong>append 인수의 사용</strong></p>
<p><code>append</code>인수를 <code>True</code>로 설정 할 경우 기존 Index를 유지하고 새 인덱스를 추가하게됩니다.</p>
<pre><code class="language-python">print(df.set_index(keys=&#39;col1&#39;,append=True))
&gt;&gt;
          col2  col3 col4
     col1
row1 A     [1]     2    X
row2 A     [2]     5    X
row3 A     [3]     3    Y
row4 B     [1]     4    Z
row5 B     [2]     1    Z
</code></pre>
<p><strong>drop 인수의 사용</strong></p>
<p><code>drop</code> 인수가 <code>False</code>일 경우 인덱스가 설정된 이후에도 해당 열이 유지됩니다.</p>
<p>기본값은 <code>True</code>로 <code>keys</code>에 설정된 열이 인덱스로 설정될 경우 열이 삭제됩니다.</p>
<pre><code class="language-python">print(df.set_index(keys=&#39;col1&#39;,drop=False))
&gt;&gt;
     col1 col2  col3 col4
col1
A       A  [1]     2    X
A       A  [2]     5    X
A       A  [3]     3    Y
B       B  [1]     4    Z
B       B  [2]     1    Z
#col1 이 그대로 유지되어있는것을 확인할 수 있습니다.&lt;br&gt;
</code></pre>
<p><strong>verify_integrity인수의 사용</strong></p>
<p><code>verify_integrity</code>인수의 기본값은 <code>False</code>로 인덱스에 중복된 값이 있더라도 출력합니다. 만약 <code>True</code>일 경우 중복값이 있다면 오류를 출력하게 됩니다.</p>
<pre><code class="language-python"># 기본값은 False로 중복을 허용
print(df.set_index(keys=&#39;col4&#39;))
&gt;&gt;
     col1 col2  col3
col4
X       A  [1]     2
X       A  [2]     5
Y       A  [3]     3
Z       B  [1]     4
Z       B  [2]     1
</code></pre>
<pre><code class="language-python"># True일 경우 인덱스에 중복값이 있다면 오류를 출력하게됩니다.&lt;br&gt;
print(df.set_index(keys=&#39;col4&#39;,verify_integrity=True))
&gt;&gt;
오류 발생
ValueError: Index has duplicate keys: Index([&#39;X&#39;, &#39;Z&#39;], dtype=&#39;object&#39;, name=&#39;col4&#39;)</code></pre>
<h2 id="접미사접두사-suffix--prefix"><strong>접미사/접두사 (suffix / prefix)</strong></h2>
<p><code>add_suffix</code>와 <code>add_preffix</code>메서드는 각각 열 이름에 접미사/접두사를 붙이는 메서드 입니다.</p>
<p><code>suffix / prefix</code> : 열 이름에 추가할 문자열입니다.</p>
<pre><code class="language-python">df = pd.DataFrame(data=[[1,2],[3,4]])
print(df)

&gt;&gt;
   0  1
0  1  2
1  3  4
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p><code>add_suffix</code>메서드를 이용할 경우 열 이름의 뒤쪽에 해당 문자열이 붙게 됩니다.</p>
<pre><code class="language-python">print(df.add_suffix(&#39;_열&#39;))
&gt;&gt;
#뒤에 붙여준다
   0_열  1_열
0    1    2
1    3    4
</code></pre>
<p><code>add_prefix</code>메서드를 이용할 경우 열 이름의 앞쪽에 해당 문자열이 붙게 됩니다.</p>
<pre><code class="language-python">print(df.add_prefix(&#39;열_&#39;))
&gt;&gt;
#앞에 붙여준다
   열_0  열_1
0    1    2
1    3    4</code></pre>
<h2 id="인덱스-변경-reindex"><strong>인덱스 변경 (reindex)</strong></h2>
<p><code>reindex</code> 메서드는 인덱스를 새 인덱스로 덮어씌우고 내용을 채우는 메서드 입니다.</p>
<p><code>labels</code> : 변경할 값입니다. <code>labels</code>인수를 이용할 경우 <code>axis</code>인수를 통해 축을 지정해줘야합니다. 추가된 index의 경우 <code>NaN</code>을 요소로 갖습니다.</p>
<p><code>index / columns</code> : 변경할 값입니다. 행과 열을 미리 지정해줍니다. 추가된 index의 경우 <code>NaN</code>을 요소로 갖습니다.</p>
<p><code>method</code> : {bfill / ffill / nearest이 결측치를 채울 규칙입니다.</p>
<blockquote>
<p>ffill : 바로 전 값으로 결측치를 채웁니다.</p>
<p>bfill : 바로 뒤 값으로 결측치를 채웁니다.</p>
<p>nearest : 근처의 유효값으로 결측치를 채웁니다.</p>
<p>※ 결측치를 채울 때 값의 전/후 값을 기준으로하는것이 아닌 인덱스의 전/후 인덱스를 기준으로 합니다.</p>
</blockquote>
<p><code>copy</code> : 사본을 생성할지 여부입니다.</p>
<p><code>level</code> : Multi Index의 경우 레벨을 선택할 수 있습니다.</p>
<p><code>fill_value</code> : 결측값을 이 값으로 변경할 수 있습니다.</p>
<p><code>limit</code> : <code>method</code>인수를 사용할 경우 몇개까지 변경할지 제한할 수 있습니다</p>
<p><code>tolerance</code> : <code>method</code>인수를 사용할 때 index가 다를 경우 허용 범위 입니다.</p>
<p>★<code>│변경 전 인덱스 - 변경 후 인덱스│≤ tolerance</code> 를 만족하게 <code>method</code> 적용 허용 범위를 정할 수 있습니다. 자세한건 예시 참고바랍니다.</p>
<pre><code class="language-python">idx = [3,6,11]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;]
data = [[1,2,3,4],[2,4,6,8],[3,6,9,12]]
df = pd.DataFrame(data,idx,col)
print(df)
&gt;&gt;
    col1  col2  col3  col4
3      1     2     3     4
6      2     4     6     8
11     3     6     9    12
</code></pre>
<hr>
<p><strong>기본적인 사용법(+fill_value인수)</strong></p>
<p>기본적으로 새 index가 될 list를 형성하고 <code>labels / axis</code>나 <code>index / columns</code>를 사용해서 적용 할 수 있습니다.</p>
<p><code>labels / axis</code>를 이용할 경우</p>
<pre><code class="language-python">col2 = [&#39;col1&#39;,&#39;idx2&#39;,&#39;idx3&#39;,&#39;col4&#39;]
print(df.reindex(labels=col2,axis=1)) # labels로 변경값을 정해주면 axis를 이용해 적용할 축을 지정해줘야함.
&gt;&gt;
    col1  idx2  idx3  col4
3      1   NaN   NaN     4
6      2   NaN   NaN     8
11     3   NaN   NaN    12
</code></pre>
<p><code>index / columns</code>를 이용할 경우</p>
<pre><code class="language-python">print(df.reindex(columns=col2)) # index나 columns를 이용해 대상 축에 변경값을 바로 적용할 수 있다.
&gt;&gt;
    col1  idx2  idx3  col4
3      1   NaN   NaN     4
6      2   NaN   NaN     8
11     3   NaN   NaN    12
</code></pre>
<p><code>fill_value</code>를 설정하면 <code>NaN</code>을 원하는 값으로 지정하여 변경할 수 있습니다.</p>
<pre><code class="language-python">print(df.reindex(columns=col2,fill_value=&#39;-&#39;))
&gt;&gt;
    col1 idx2 idx3  col4
3      1    -    -     4
6      2    -    -     8
11     3    -    -    12
</code></pre>
<p><strong>method 와 limit의 사용</strong></p>
<p><code>method</code>를 이용하면 결측치를 앞/뒤/근처의 인덱스를 기준으로 변경이 가능합니다.</p>
<p>먼저 기존 열에 새 열을 <code>reindex</code>메서드를 이용해 추가해보겠습니다.</p>
<pre><code class="language-python">col3 = [&#39;col0&#39;,&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;,&#39;col5&#39;,&#39;col6&#39;,&#39;col7&#39;]
print(df.reindex(columns=col3))
&gt;&gt;
    col0  col1  col2  col3  col4  col5  col6  col7 #새로 추가된 열은 NaN을 가진다.
3    NaN     1     2     3     4   NaN   NaN   NaN
6    NaN     2     4     6     8   NaN   NaN   NaN
11   NaN     3     6     9    12   NaN   NaN   NaN
</code></pre>
<p><code>method=&#39;bfill&#39;</code>인 경우 뒤의 열의 값을 가져옵니다.</p>
<pre><code class="language-python">print(df.reindex(columns=col3,method=&#39;bfill&#39;))
&gt;&gt;
    col0  col1  col2  col3  col4  col5  col6  col7 # col0의 경우 뒤의 열인 col1의 값을 가져옴.
3      1     1     2     3     4   NaN   NaN   NaN # col5, col6, col7의 경우 뒤의 열이 없으니 변경 불가.
6      2     2     4     6     8   NaN   NaN   NaN
11     3     3     6     9    12   NaN   NaN   NaN
</code></pre>
<p><code>method=&#39;ffill&#39;</code>인 경우 앞의 열의 값을 가져옵니다.</p>
<pre><code class="language-python">print(df.reindex(columns=col3,method=&#39;ffill&#39;))
&gt;&gt;
    col0  col1  col2  col3  col4  col5  col6  col7 # col0의 경우 앞에 열이 없으므로 변경 불가
3    NaN     1     2     3     4     4     4     4 # col5, col6, col7의 경우 앞의 열의 값을 가져옴
6    NaN     2     4     6     8     8     8     8
11   NaN     3     6     9    12    12    12    12
</code></pre>
<p><code>limit</code>는 <code>method</code>로 변경할 열의 갯수를 제한할 수 있습니다.</p>
<pre><code class="language-python">print(df.reindex(columns=col3,method=&#39;ffill&#39;,limit=2))
&gt;&gt;
    col0  col1  col2  col3  col4  col5  col6  col7 # ffill으로 변경할 열의 수를 2로 제한하였기때문에 col5, col6만 변경됨.
3    NaN     1     2     3     4     4     4   NaN
6    NaN     2     4     6     8     8     8   NaN
11   NaN     3     6     9    12    12    12   NaN
</code></pre>
<p><strong>tolerance 인수의 사용</strong></p>
<p><code>│변경 전 인덱스 - 변경 후 인덱스│≤ tolerance</code> 를 만족하게 <code>method</code> 적용 허용 범위를 정할 수 있습니다.</p>
<p><code>tolerance=1</code>인 경우</p>
<pre><code class="language-python">idx2 = [4, 8, 14]
print(df.reindex(index=idx2,method=&#39;ffill&#39;,tolerance=1))
&gt;&gt;
    col1  col2  col3  col4
4    1.0   2.0   3.0   4.0 # │3-4│=1 만족
8    NaN   NaN   NaN   NaN # │6-8│ = 2 불만족
14   NaN   NaN   NaN   NaN # │11-14│ = 3 불만족
</code></pre>
<p><code>tolerance=2</code>인 경우</p>
<pre><code class="language-python">idx2 = [4, 8, 14]
print(df.reindex(index=idx2,method=&#39;ffill&#39;,tolerance=2))
&gt;&gt;
    col1  col2  col3  col4
4    1.0   2.0   3.0   4.0 # │3-4│=1 만족
8    2.0   4.0   6.0   8.0 # │6-8│=2 만족
14   NaN   NaN   NaN   NaN # │11-14│=3 불만족
</code></pre>
<p><code>tolerance=3</code>인 경우</p>
<pre><code class="language-python">idx2 = [4, 8, 14]
print(df.reindex(index=idx2,method=&#39;ffill&#39;,tolerance=3))
&gt;&gt;
    col1  col2  col3  col4
4      1     2     3     4 # │3-4│=1 만족
8      2     4     6     8 # │6-8│=2 만족
14     3     6     9    12 # │11-14│=3 만족</code></pre>
<h1 id="인덱스-변경-reindex_like"><strong>인덱스 변경 (reindex_like)</strong></h1>
<p><code>reindex_like</code>메서드는 <code>other</code>의 인덱스를 기준으로 <code>self</code>의 인덱스와 값을 적용하는 메서드입니다.</p>
<p>self.reindex_like(other, method=None, copy=True, limit=None, tolerance=None)</p>
<p><code>method</code> : {bfill / ffill / nearest이 결측치를 채울 규칙입니다.</p>
<blockquote>
<p>ffill : 바로 전 값으로 결측치를 채웁니다.</p>
<p>bfill : 바로 뒤 값으로 결측치를 채웁니다.</p>
<p>nearest : 근처의 유효값으로 결측치를 채웁니다.</p>
<p>※ 결측치를 채울 때 값의 전/후 값을 기준으로하는것이 아닌 인덱스의 전/후 인덱스를 기준으로 합니다.</p>
</blockquote>
<p><code>copy</code> : 사본을 생성할지 여부입니다.</p>
<p><code>limit</code> : <code>method</code>인수를 사용할 경우 몇개까지 변경할지 제한할 수 있습니다</p>
<p><code>tolerance</code> : <code>method</code>인수를 사용할 때 index가 다를 경우 허용 범위 입니다.</p>
<p>★<code>│변경 전 인덱스 - 변경 후 인덱스│≤ tolerance</code> 를 만족하게 <code>method</code> 적용 허용 범위를 정할 수 있습니다.</p>
<p>먼저 <code>self</code>가 될 객체와, <code>other</code>가 될 객체를 만들어보겠습니다.</p>
<pre><code class="language-python">col1  = [&#39;col1&#39;,&#39;col3&#39;,&#39;col6&#39;]
idx1  = [&#39;row0&#39;,&#39;row2&#39;,&#39;row3&#39;]
data1 = [[&#39;A&#39;,&#39;X&#39;,&#39;+&#39;],[&#39;B&#39;,&#39;Y&#39;,&#39;-&#39;],[&#39;C&#39;,&#39;Z&#39;,&#39;=&#39;]]
self = pd.DataFrame(data1, idx1, col1)
print(self)
&gt;&gt;
     col1 col3 col6
row0    A    X    +
row2    B    Y    -
row3    C    Z    =
</code></pre>
<pre><code class="language-python">col2  = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;,&#39;col5&#39;,&#39;col6&#39;]
idx2  = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
data2 = [[1,2,3,4,5,6],[2,3,6,8,10,12],[3,6,9,12,15,18]]
other = pd.DataFrame(data2, idx2, col2)
print(other)
&gt;&gt;
      col1  col2  col3  col4  col5  col6
row1     1     2     3     4     5     6
row2     2     3     6     8    10    12
row3     3     6     9    12    15    18
</code></pre>
<h2 id="인덱스를-열로-변환-reset_index"><strong>인덱스를 열로 변환 (reset_index)</strong></h2>
<p><code>reset_index</code>메서드는 설정 인덱스를 제거하고 기본 인덱스(0,1,2, ... , n)으로 변경하는 메서드 입니다.</p>
<p><code>level</code> : Multi Index의 경우 제거할 인덱스의 레벨을 설정할수 있습니다. 기본적으로 모든 레벨입니다.</p>
<p><code>drop</code> : 제거한 인덱스를 열에 추가할지 여부입니다. 기본값은 <code>False</code>로 제거된 인덱스는 열로 변환됩니다.</p>
<p><code>inplace</code> : pandas 공통 인수로, 원본을 변경할지 여부 입니다.</p>
<p><code>col_level / col_fill</code> : Multi Index의 경우 제거된 인덱스를 열에 추가할 때 레벨과 열의 이름을 설정할 수 있습니다.</p>
<p><code>col_level</code>을 통해 레벨을 설정하고, <code>col_fill</code>을통해 해당 열의 이름을 정합니다.</p>
<pre><code class="language-python">df = pd.DataFrame([[1,2],[3,4],[5,6]],[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;],[&#39;col1&#39;,&#39;col2&#39;])
print(df)
&gt;&gt;
      col1  col2
row1     1     2
row2     3     4
row3     5     6</code></pre>
<p>.</p>
<p><strong>기본적인 사용법(+drop, inplace)</strong></p>
<p>기본적으로 아무 인수 없이 사용하게 되면, 모든 레벨에 대해 인덱스가 제거되며, 열에 추가됩니다.</p>
<pre><code class="language-python">print(df.reset_index())
&gt;&gt;
# index라는 열이 생성되고 기존 인덱스가 기본 인덱스로 변경됨
# 기존 인덱스는 열로 변함
  index  col1  col2 
0  row1     1     2
1  row2     3     4
2  row3     5     6
</code></pre>
<p><code>drop = True</code>인 경우 열이 밖으로 꺼내지는게 아니라 완전히 삭제됩니다</p>
<pre><code class="language-python">print(df.reset_index(drop=True))
&gt;&gt;
#밖으로 꺼내지는게 아닌 완전한 삭제를 합니다
   col1  col2
0     1     2
1     3     4
2     5     6
</code></pre>
<p><code>inplace=True</code>인 경우 원본이 변경되게 됩니다.</p>
<pre><code class="language-python">Copydf.reset_index(inplace=True)
print(df)
&gt;&gt;
  index  col1  col2
0  row1     1     2
1  row2     3     4
2  row3     5     6</code></pre>
<h3 id="multi-index의-예시">Multi Index의 예시</h3>
<p>Multi Index의 예시를 위하여 4x4짜리 Multi Index를 하나 생성하겠습니다.</p>
<pre><code class="language-python">idx = [[&#39;IDX1&#39;,&#39;IDX1&#39;,&#39;IDX2&#39;,&#39;IDX2&#39;],[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]]
col = [[&#39;COL1&#39;,&#39;COL1&#39;,&#39;COL2&#39;,&#39;COL2&#39;],[&#39;val1&#39;,&#39;val2&#39;,&#39;val3&#39;,&#39;val4&#39;]]
data = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
df2 = pd.DataFrame(data,idx,col)
print(df2)
&gt;&gt;
          COL1      COL2
          val1 val2 val3 val4
IDX1 row1    1    2    3    4
     row2    5    6    7    8
IDX2 row3    9   10   11   12
     row4   13   14   15   16
</code></pre>
<hr>
<p><strong>기본적인 사용법(+level)</strong></p>
<p>Multi Index의 경우 <code>level</code>을 설정해줌으로서 제거할 인덱스의 레벨을 선택할 수 있습니다.</p>
<p><code>level</code>을 입력하지 않은 경우 모든 index에 대해서 수행됩니다.</p>
<pre><code class="language-python">print(df2.reset_index())
&gt;&gt;
  level_0 level_1 COL1      COL2
                  val1 val2 val3 val4
0    IDX1    row1    1    2    3    4
1    IDX1    row2    5    6    7    8
2    IDX2    row3    9   10   11   12
3    IDX2    row4   13   14   15   16
</code></pre>
<p><code>level=0</code>인 경우</p>
<pre><code class="language-python">print(df2.reset_index(level=0))
&gt;&gt;
     level_0 COL1      COL2
             val1 val2 val3 val4
row1    IDX1    1    2    3    4
row2    IDX1    5    6    7    8
row3    IDX2    9   10   11   12
row4    IDX2   13   14   15   16
</code></pre>
<p><code>level=1</code>인 경우</p>
<pre><code class="language-python">print(df2.reset_index(level=1))
&gt;&gt;
     level_1 COL1      COL2
             val1 val2 val3 val4
IDX1    row1    1    2    3    4
IDX1    row2    5    6    7    8
IDX2    row3    9   10   11   12
IDX2    row4   13   14   15   16
</code></pre>
<p><strong>col_fill / col_level의 사용</strong></p>
<p><code>col_fill</code>을 이용하여 열로 변경되는 인덱스의 열 이름을 설정할 수 있습니다. <code>COL0</code>으로 설정해보겠습니다.</p>
<pre><code class="language-python">print(df2.reset_index(level=1,col_fill=&#39;COL0&#39;))
&gt;&gt;
     level_1 COL1      COL2
        COL0 val1 val2 val3 val4 #COL0이 열 이름으로 생성됨.
IDX1    row1    1    2    3    4
IDX1    row2    5    6    7    8
IDX2    row3    9   10   11   12
IDX2    row4   13   14   15   16
</code></pre>
<p><code>col_level</code>을 이용해 열 이름의 레벨을 정할 수 있습니다. <code>COL0</code>을 다른 열이름에 맞게 LEVEL을 변경해보겠습니다.</p>
<pre><code class="language-python">print(df2.reset_index(level=1,col_fill=&#39;COL0&#39;,col_level=1))
&gt;&gt;
        COL0 COL1      COL2
     level_1 val1 val2 val3 val4
IDX1    row1    1    2    3    4
IDX1    row2    5    6    7    8
IDX2    row3    9   10   11   12
IDX2    row4   13   14   15   16</code></pre>
<h2 id="멀티인덱스-레벨-변경-reorder_levels"><strong>멀티인덱스 레벨 변경 (reorder_levels)</strong></h2>
<p><code>reorder_levels</code>메서드는 Multi Index에서 Index의 위치를 변경하는 메서드입니다.</p>
<p><code>order</code> : 새로 정렬할 인덱스 순서입니다. 리스트 형태입니다.</p>
<p><code>axis</code> : {0 : index / 1 : columns} 순서를 적용할 축 입니다.</p>
<pre><code class="language-python">idx = [[&#39;IDX1&#39;,&#39;IDX1&#39;,&#39;IDX2&#39;,&#39;IDX2&#39;],[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]]
col = [[&#39;COL1&#39;,&#39;COL1&#39;,&#39;COL2&#39;,&#39;COL2&#39;],[&#39;val1&#39;,&#39;val2&#39;,&#39;val3&#39;,&#39;val4&#39;]]
data = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
df = pd.DataFrame(data,idx,col)
print(df)
&gt;&gt;
          COL1      COL2
          val1 val2 val3 val4
IDX1 row1    1    2    3    4
     row2    5    6    7    8
IDX2 row3    9   10   11   12
     row4   13   14   15   16
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p><code>order</code>에 리스트 형태의 level 순서를 입력하므로써 인덱스 순서의 변경이 가능합니다.</p>
<pre><code class="language-python">print(df.reorder_levels([1,0])) #인덱스 순서를 레벨1 - 레벨0으로 변경
&gt;&gt;
          COL1      COL2
          val1 val2 val3 val4
row1 IDX1    1    2    3    4
row2 IDX1    5    6    7    8
row3 IDX2    9   10   11   12
row4 IDX2   13   14   15   16
</code></pre>
<p><code>axis</code>를 설정하여 적용될 축을 지정할 수 있습니다.</p>
<pre><code class="language-python">print(df.reorder_levels([1,0],axis=1))
&gt;&gt;
          val1 val2 val3 val4
          COL1 COL1 COL2 COL2
IDX1 row1    1    2    3    4
     row2    5    6    7    8
IDX2 row3    9   10   11   12
     row4   13   14   15   16</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-04-16]]></title>
            <link>https://velog.io/@smile_07/2025-04-16</link>
            <guid>https://velog.io/@smile_07/2025-04-16</guid>
            <pubDate>Wed, 16 Apr 2025 11:07:09 GMT</pubDate>
            <description><![CDATA[<h2 id="인덱스-index"><strong>인덱스 (Index)</strong></h2>
<p><code>index</code>메서드는 pandas객체의 index(행)를 출력합니다</p>
<p>df.index</p>
<p><strong>실행 결과</strong></p>
<p>실행결과는 아래와 같이 Index명과 type이 차례로 출력되는것을 볼 수 있습니다.</p>
<p>반환 타입은 pandas의 Index타입임을 사용에 참고 바랍니다.</p>
<pre><code class="language-python">result = df.index
print(result)
&gt;&gt;
Index([&#39;row1&#39;, &#39;row2&#39;, &#39;row3&#39;], dtype=&#39;object&#39;)</code></pre>
<h2 id="열-columns"><strong>열 (Columns)</strong></h2>
<p><code>columns</code>메서드는 pandas객체의 columns(열)을 출력합니다.</p>
<pre><code class="language-python">df = pd.DataFrame([[1,2,3], [4,5,6], [7,8,9]], index=[&#39;row1&#39;, &#39;row2&#39;, &#39;row3&#39;], columns=[&#39;col1&#39;, &#39;col2&#39;, &#39;col3&#39;])
print(df)</code></pre>
<p>실행결과는 아래와 같이 columns명과 type이 차례로 출력되는것을 볼 수 있습니다. 반환 타입은 index함수에서와 같이 pandas의 Index타입임을 사용에 참고 바랍니다.</p>
<pre><code class="language-python">result = df.columns
print(result)
&gt;&gt;
Index([&#39;col1&#39;, &#39;col2&#39;, &#39;col3&#39;], dtype=&#39;object&#39;)</code></pre>
<h2 id="데이터-타입-dtype"><strong>데이터 타입 (dtype)</strong></h2>
<p><code>dtypes</code> 메서드는 열에 포함된 데이터들의 type을 Series형태로 반환합니다.</p>
<p>반환된 Series의 index는 원래 DataFrame 객체의 columns(열)에 해당됩니다.</p>
<pre><code class="language-python">df = pd.DataFrame([[1,&#39;A&#39;,3.1], [4,&#39;B&#39;,6.2], [7,&#39;C&#39;,9.3]], index=[&#39;row1&#39;, &#39;row2&#39;, &#39;row3&#39;], columns=[&#39;col1&#39;, &#39;col2&#39;, &#39;col3&#39;])
print(df)
&gt;&gt;
      col1 col2  col3
row1     1    A   3.1
row2     4    B   6.2
row3     7    C   9.3</code></pre>
<p>아래와 같이 실행 시 각 columns에 대해 dtypes를 반환합니다. 만약 type이 혼합되어있는경우</p>
<p>object 타입으로 반환합니다.</p>
<pre><code class="language-python">result = df.dtypes
print(result)
&gt;&gt;
col1      int64
col2     object
col3    float64
dtype: object
#시리즈로 받아낸다</code></pre>
<pre><code class="language-python">print(type(result))
&gt;&gt;
&lt;class &#39;pandas.core.series.Series&#39;&gt;</code></pre>
<h2 id="축-axes"><strong>축 (axes)</strong></h2>
<p><code>axes</code>메서드는 DataFrame 객체의 축(axes) 레이블 정보를 list형태로 반환합니다.</p>
<p>list의 첫 번째 요소는 행(row), 두 번째 요소는 열(columns)로 반환되며, 각각의 type은 index입니다.</p>
<p>추가로 요소의 type이 함께 출력됩니다.</p>
<pre><code class="language-python">df = pd.DataFrame(data=[[1,2],[3,4],[5,6],[7,8]],index=[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;],columns=[&#39;col1&#39;,&#39;col2&#39;])
print(df)
&gt;&gt;
      col1  col2
row1     1     2
row2     3     4
row3     5     6
row4     7     8</code></pre>
<p>df.axes실행시 아래와 같이 list형태로 축의 정보가 출력되는것을 확인할 수 있습니다.</p>
<pre><code class="language-python">result = df.axes
print(result)
&gt;&gt;
[Index([&#39;row1&#39;, &#39;row2&#39;, &#39;row3&#39;, &#39;row4&#39;], dtype=&#39;object&#39;), Index([&#39;col1&#39;, &#39;col2&#39;], dtype=&#39;object&#39;)]
</code></pre>
<pre><code class="language-python">print(result[0])
&gt;&gt;
Index([&#39;row1&#39;, &#39;row2&#39;, &#39;row3&#39;, &#39;row4&#39;], dtype=&#39;object&#39;)
</code></pre>
<pre><code class="language-python">print(result[1])
&gt;&gt;
Index([&#39;col1&#39;, &#39;col2&#39;], dtype=&#39;object&#39;)
</code></pre>
<h2 id="차원-ndim"><strong>차원 (ndim)</strong></h2>
<p><code>ndim</code>메서드는 데이터의 차원(축의 수)를 반환합니다. Series일경우 1차원, DataFrame이면 2차원이므로</p>
<p>데이터의 종류 파악에 사용할 수 있습니다.</p>
<pre><code class="language-python">df1 = pd.Series({&#39;idx1&#39;:1,&#39;idx2&#39;:2,&#39;idx2&#39;:2})
print(df1)
&gt;&gt;
idx1    1
idx2    2
dtype: int64
</code></pre>
<pre><code class="language-python">df2 = pd.DataFrame(data=[[1,2],[3,4]],index=[&#39;row1&#39;,&#39;row2&#39;],columns=[&#39;col1&#39;,&#39;col2&#39;])
print(df2)
&gt;&gt;
      col1  col2
row1     1     2
row2     3     4
</code></pre>
<p>ndim 함수 사용시, Series의 경우 1을 반환하고 DataFrame의 경우 2를 반환하는것을 확인할 수 있습니다.</p>
<pre><code class="language-python">Copyprint(df1.ndim)
print(df2.ndim)
&gt;&gt; 1
&gt;&gt; 2</code></pre>
<h2 id="요소의-갯수size"><strong>요소의 갯수(size)</strong></h2>
<p><code>size</code>메서드는 데이터의 총 수의 갯수를 구합니다. 즉, Series일 경우 행의 수를 반환하고</p>
<pre><code class="language-python">df1 = pd.Series({&#39;idx1&#39;:1,&#39;idx2&#39;:2,&#39;idx2&#39;:2})
print(df1)
&gt;&gt;
idx1    1
idx2    2
dtype: int64
</code></pre>
<pre><code class="language-python">df2 = pd.DataFrame(data=[[1,2],[3,4]],index=[&#39;row1&#39;,&#39;row2&#39;],columns=[&#39;col1&#39;,&#39;col2&#39;])
print(df2)
&gt;&gt;
      col1  col2
row1     1     2
row2     3     4
</code></pre>
<p>size 함수 사용시, 요소의 수를 반환 한 것을 확인 할 수 있습니다.</p>
<pre><code class="language-python">print(df1.size)
print(df2.size)
&gt;&gt; 2
&gt;&gt; 4
</code></pre>
<h2 id="차원의-형태-shape"><strong>차원의 형태 (shape)</strong></h2>
<p><code>shape</code> 메서드는 DataFrame 객체의 차원의 형태를(레이블 정보)를 튜플의 형식으로 반환합니다.</p>
<p>즉, 3행 2열의 객체의 경우 (3,2)를 반환합니다.</p>
<pre><code class="language-python">data1= [[1,2,3],[4,5,6],[7,8,9]]
df1 = pd.DataFrame(data = data1, index = [&#39;row1&#39;, &#39;row2&#39;, &#39;row3&#39;], columns=[&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;])
print(df1)
&gt;&gt;
      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9</code></pre>
<pre><code class="language-python">data2 = [[1,2,3,4]]
df2 = pd.DataFrame(data =data2, index = [&#39;row1&#39;], columns=[&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;])
print(df2)
&gt;&gt;
      col1  col2  col3  col4
row1     1     2     3     4</code></pre>
<p>shape 함수 사용 시, 아래와 같이 3행3열, 1행4열의 정보가 튜플 형태로 반환된 것을 확인할 수 있습니다.</p>
<pre><code class="language-python">print(df1.shape)
print(df2.shape)
&gt;&gt;(3, 3)
&gt;&gt;(1, 4)
</code></pre>
<h2 id="정보축-keys"><strong>정보축 (keys)</strong></h2>
<p><code>keys</code> 메서드는 &#39;info axis(정보축)&#39; 값을 가져옵니다.</p>
<p>여기서 정보축이란 Series에서는 index, DataFrame에서는 열을 말합니다.</p>
<pre><code class="language-python">data = [[1,2,3],[4,5,6],[7,8,9]]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
row = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
df = pd.DataFrame(data=data,index=row,columns=col)
print(df)
&gt;&gt;
      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9</code></pre>
<p>DataFrame 객체이기 때문에 key 메서드를 사용할 경우 열의 값을 가져옵니다.</p>
<pre><code class="language-python">print(df.keys)
.&gt;&gt;
&lt;bound method NDFrame.keys of       col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9&gt;</code></pre>
<h2 id="키값열의-요소-반환-get"><strong>키값(열의 요소) 반환 (get)</strong></h2>
<p>get 메서드는 pandas객체에서 key값(예: DataFrame에서 열)을 검색해서 요소를 가져옵니다.</p>
<p>찾는게 없을경우 default 값을 반환합니다.</p>
<pre><code class="language-python">data = [[1,2,3],[4,5,6],[7,8,9]]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
row = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
df = pd.DataFrame(data=data,index=row,columns=col)
print(df)
&gt;&gt;
      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9</code></pre>
<p>key=&#39;col1&#39;로 해서 col1의 요소를 반환해보겠습니다.</p>
<pre><code class="language-python">result = df.get(&#39;col1&#39;)
print(result)
&gt;&gt;
row1    1
row2    4
row3    7
Name: col1, dtype: int64</code></pre>
<p>key=&#39;col4&#39;로 해서 존재하지 않는 col4를 반환하면 default 값인 None을 반환하게 됩니다.</p>
<pre><code class="language-python">result = df.get(&#39;col100&#39;)
print(result)
&gt;&gt;
None</code></pre>
<p>default값을 설정해줌으로써 원하는 반환을 설정할 수 있습니다.</p>
<pre><code class="language-python">result = df.get(&#39;col4&#39;,default=&#39;값이없습니다.&#39;)
print(result)
&gt;&gt;
값이없습니다.
</code></pre>
<h2 id="비교-compare"><strong>비교 (compare)</strong></h2>
<p><code>compare</code> 메서드는 두 객체의 요소의 차이를 반환합니다.</p>
<p><code>other</code> : 원본과 비교할 데이터입니다. <code>align_axis</code> : {0 : index / 1 : columns} self와 other를 정렬할 축입니다.</p>
<p><code>keep_shape</code> : 원본의 모양을 유지할지 여부입니다. <code>False</code>인 경우 차이가 있는 행만 출력합니다.</p>
<p><code>keep_equal</code> : 값이 같은경우 값을 출력할지 여부입니다. 기본값은 <code>False</code>로 <code>NaN</code>을 출력합니다.</p>
<pre><code class="language-python">idx = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
data1 = [[&#39;A&#39;,1,11],[&#39;B&#39;,2,12],[&#39;C&#39;,3,13],[&#39;D&#39;,4,14]]
data2 = [[&#39;X&#39;,1,11],[&#39;B&#39;,&#39;Y&#39;,12],[&#39;C&#39;,3,13],[&#39;D&#39;,4,&#39;Z&#39;]]
df1 = pd.DataFrame(data1, idx, col)
df2 = pd.DataFrame(data2, idx, col)
print(df1)
print(df2)
&gt;&gt;
     col1  col2  col3
row1    A     1    11
row2    B     2    12
row3    C     3    13
row4    D     4    14

     col1 col2 col3
row1    X    1   11
row2    B    Y   12
row3    C    3   13
row4    D    4    Z
</code></pre>
<p><code>compare</code>메서드를 이용해서 단순히 <code>df1</code>과 <code>df2</code>를 비교할 경우 아래와 같이 <code>self</code>와 <code>other</code>이 multi columns로 추가되며 차이가 있는 행만 출력하고, 동일한 값은 <code>NaN</code>을 출력하게 됩니다.</p>
<pre><code class="language-python">print(df1.compare(df2))#df1을 df2에 비교한다 
#self = df1
#other = df2
&gt;&gt;
     col1       col2        col3
     self other self other  self other
row1    A     X  NaN   NaN   NaN   NaN
row2  NaN   NaN  2.0     Y   NaN   NaN
row4  NaN   NaN  NaN   NaN  14.0     Z
</code></pre>
<p><strong>align_axis인수의 사용</strong></p>
<p><code>align_axis</code>인수를 사용하여 <code>self</code>와 <code>other</code> 카테고리가 multi index로 반환될지 multi columns로 반환될지 지정할 수 있습니다.</p>
<p><code>align_axis=0</code>일 경우 multi index로 출력됩니다.</p>
<pre><code class="language-python">print(df1.compare(other=df2, align_axis=0))
&gt;&gt;
           col1 col2  col3
row1 self     A  NaN   NaN
     other    X  NaN   NaN
row2 self   NaN  2.0   NaN
     other  NaN    Y   NaN
row4 self   NaN  NaN  14.0
     other  NaN  NaN     Z
</code></pre>
<p><code>align_axis=1</code>일 경우 multi columns으로 출력됩니다.(기본값)</p>
<pre><code class="language-python">print(df1.compare(other=df2, align_axis=1))
&gt;&gt;
     col1       col2        col3
     self other self other  self other
row1    A     X  NaN   NaN   NaN   NaN
row2  NaN   NaN  2.0     Y   NaN   NaN
row4  NaN   NaN  NaN   NaN  14.0     Z
</code></pre>
<p><strong>keep_shape인수의 사용</strong></p>
<p><code>keep_shape=True</code>로 사용할 경우 기존 열을 모두 출력하게되고, <code>keep_shape=False</code>일 경우(기본값) 차이가 있는 열만 출력하게 됩니다.</p>
<pre><code class="language-python">print(df1.compare(other=df2, keep_shape=True))
&gt;&gt;
     col1       col2        col3
     self other self other  self other
row1    A     X  NaN   NaN   NaN   NaN
row2  NaN   NaN  2.0     Y   NaN   NaN
row3  NaN   NaN  NaN   NaN   NaN   NaN
row4  NaN   NaN  NaN   NaN  14.0     Z
</code></pre>
<pre><code class="language-python">print(df1.compare(other=df2, keep_shape=False))
&gt;&gt;
     col1       col2        col3
     self other self other  self other
row1    A     X  NaN   NaN   NaN   NaN
row2  NaN   NaN  2.0     Y   NaN   NaN
row4  NaN   NaN  NaN   NaN  14.0     Z
</code></pre>
<p><strong>keep_equal인수의 사용</strong></p>
<p><code>keep_equal</code>인수를 사용할 경우 같은값을 출력할지 아니면 <code>NaN</code>으로 출력할지 지정할 수 있습니다.</p>
<p><code>keep_eaual=True</code>인 경우 같은값도 출력합니다.</p>
<pre><code class="language-python">print(df1.compare(other=df2, keep_equal=True))
&gt;&gt;
     col1       col2       col3
     self other self other self other
row1    A     X    1     1   11    11
row2    B     B    2     Y   12    12
row4    D     D    4     4   14     Z
</code></pre>
<p><code>keep_eaual=False</code>인 경우 같은값은 <code>NaN</code>을 출력합니다.(기본값)</p>
<pre><code class="language-python">Copyprint(df1.compare(other=df2, keep_equal=False))
&gt;&gt;
     col1       col2        col3
     self other self other  self other
row1    A     X  NaN   NaN   NaN   NaN
row2  NaN   NaN  2.0     Y   NaN   NaN
row4  NaN   NaN  NaN   NaN  14.0     Z
</code></pre>
<h2 id="고유한-행의-수-value_counts"><strong>고유한 행의 수 (value_counts)</strong></h2>
<p><code>value_counts</code>메서드는 고유한 행의 갯수를 반환합니다.</p>
<p>고유한 행이란 구성요소의 값이 완전히 동일한 경우를 말합니다.</p>
<p><code>subset</code> : 기준으로 삼을 열 입니다. <code>list</code>형태로도 입력이 가능합니다.</p>
<p><code>normalize</code> : 갯수가 아니라 비율로 출력합니다.</p>
<p><code>sort</code> : 빈도 순서로 정렬할지 여부입니다. 기본값은 <code>True</code>입니다.</p>
<p><code>ascending</code> : 오름차순으로 정렬할지 여부입니다.</p>
<p><code>dropna</code> : 결측치를 제외할지 여부입니다. 기본값은 <code>True</code>로 결측값은 제외됩니다.</p>
<pre><code class="language-python">n=np.NaN
idx = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;,&#39;row5&#39;]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
data = [[&#39;A&#39;,&#39;Z&#39;,3,],[&#39;D&#39;,&#39;Y&#39;,n],[&#39;B&#39;,&#39;Z&#39;,3],[&#39;C&#39;,&#39;Y&#39;,8],[&#39;A&#39;,&#39;Z&#39;,3]]
df = pd.DataFrame(data, idx, col)
print(df)
&gt;&gt;
     col1 col2  col3
row1    A    Z   3.0
row2    D    Y   NaN
row3    B    Z   3.0
row4    C    Y   8.0
row5    A    Z   3.0</code></pre>
<p><strong>기본적인 사용법(+subset)</strong></p>
<p>요소로 아무값도 입력하지 않는 경우 행의 모든 값을 대상으로 완전히 같은 행의 갯수를 우측에 출력하게됩니다.</p>
<pre><code class="language-python">print(df.value_counts())
&gt;&gt;

## row1과 row5는 완벽히 동일한 값을 가지므로 2로 출력되고, row2의 경우 결측치가 있어 제외됨.
col1  col2  col3
A     Z     3.0     2
B     Z     3.0     1
C     Y     8.0     1
Name: count, dtype: int64</code></pre>
<p><code>subset</code>에 값을 입력해 줄경우 입력된 열의 값에 대해서만 동일성 검증을 진행하게 됩니다.</p>
<p><code>col2</code>, <code>col3</code>에 대해서만 실행해보겠습니다.</p>
<pre><code class="language-python">print(df.value_counts(subset=[&#39;col2&#39;,&#39;col3&#39;]))
&gt;&gt;
col2  col3  # row1, row3, row5는 col2, col3의 값이 같으므로 3으로 출력됩니다.
Z     3.0     3
Y     8.0     1
dtype: int64
</code></pre>
<p><strong>normalize인수의 사용</strong></p>
<p><code>normalize</code>인수를 사용할 경우 동일한 행의 갯수가 아닌 전체에서 차지하는 비율로 출력됩니다.</p>
<p><code>normalize=False</code>인 경우(기본값)</p>
<pre><code class="language-python">print(df.value_counts(subset=&#39;col2&#39;,normalize=False))
&gt;&gt;
col2
Z    3
Y    2
dtype: int64
</code></pre>
<p><code>normalize=True</code>인 경우</p>
<pre><code class="language-python">print(df.value_counts(subset=&#39;col2&#39;,normalize=True))
&gt;&gt;
col2
Z    0.6    #전체 5개중 3개로 60% 인 0.6 출력
Y    0.4    #전체 5개중 2개로 40% 인 0.4 출력
dtype: float64
</code></pre>
<p><strong>ort와 ascending인수의 사용</strong></p>
<p><code>sort</code>인수를 사용할 경우 최빈값부터 정렬하게되고, <code>ascending</code>을 사용할 경우 오름차순으로 정렬하게 됩니다.</p>
<p>먼저 비교를 위해 <code>sort=False</code>이고 <code>ascending=False</code>으로 출력해보겠습니다.</p>
<pre><code class="language-python">print(df.value_counts(subset=[&#39;col2&#39;,&#39;col3&#39;],sort=False,ascending=False))
&gt;&gt;
col2  col3
Y     8.0     1
Z     3.0     3
dtype: int64
</code></pre>
<p><code>sort=True</code>인 경우(기본값) 제일 고유값의 갯수가 많은 행부터 정렬됩니다.</p>
<pre><code class="language-python">print(df.value_counts(subset=[&#39;col2&#39;,&#39;col3&#39;],sort=True,ascending=False))
&gt;&gt;
col2  col3
Z     3.0     3
Y     8.0     1
dtype: int64
</code></pre>
<p><code>ascending=True</code>인 경우 오름차순으로 정렬됩니다.</p>
<pre><code class="language-python">print(df.value_counts(subset=[&#39;col2&#39;,&#39;col3&#39;],sort=True,ascending=True))
&gt;&gt;
col2  col3
Y     8.0     1
Z     3.0     3
dtype: int64
</code></pre>
<p><strong>dropna의 사용(결측치 포함 여부)</strong></p>
<p><code>dropna=True</code>인 경우(기본값) 결측치가 포함된 행은 계산하지 않습니다. <code>False</code>인 경우 포함하게됩니다.</p>
<pre><code class="language-python">Copyprint(df.value_counts(subset=[&#39;col2&#39;,&#39;col3&#39;],dropna=False))
&gt;&gt;
col2  col3
Z     3.0     3
Y     8.0     1
      NaN     1
dtype: int64</code></pre>
<h2 id="고유한-요소의-수-nunique"><strong>고유한 요소의 수 (nunique)</strong></h2>
<p><code>nunique</code>메서드는 선택된 축에 대해서 고유한 요소의 수를 구하는 메서드입니다.</p>
<p><code>axis</code> : 기준이 되는 축 입니다.</p>
<p><code>dropna</code> : 결측치를 무시할지 여부 입니다. <code>False</code>일경우 하나의 요소로 간주합니다.</p>
<pre><code class="language-python">idx =  [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
col =  [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
data = [[1,1,n],[1,2,6],[1,3,n]]
df = pd.DataFrame(data, idx, col)
print(df)
&gt;&gt;
      col1  col2  col3
row1     1     1   NaN
row2     1     2   6.0
row3     1     3   NaN
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p>기본값인 <code>axis=0</code>으로 실행할 경우 각 축에 대해서 고유값의 갯수를 출력합니다.</p>
<p>즉, 각 열에 대해서 값의 종류의 수를 반환합니다.</p>
<pre><code class="language-python">print(df.nunique(axis=0))
&gt;&gt;
col1    1 # col1의 경우 1 한종류만 있음
col2    3 # col2의 경우 1,2,3으로 3 종류있음
col3    1 # col3의 경우 na를 제외하고 6 한종류만 있음
dtype: int64</code></pre>
<p>만약 <code>dropna=False</code>로 할 경우 <code>NaN</code>도 하나의 요소로 간주합니다.</p>
<pre><code class="language-python">print(df.nunique(axis=0,dropna=False))
&gt;&gt;
#dropna가 false면 nan도 하나의 요소로 간주하기 때문에 1-&gt;2로 유니크가 늘어난다
col1    1
col2    3
col3    2 # col3에는 NaN과 6, 2 종류가 있음
dtype: int64
</code></pre>
<p><code>axis=1</code>로 하면 행 기준으로 메서드가 실행됩니다.</p>
<pre><code class="language-python">print(df.nunique(axis=1))
&gt;&gt;
row1    1
row2    3
row3    2
dtype: int64</code></pre>
<h2 id="dtype변경-astype"><strong>dtype변경 (astype)</strong></h2>
<p><code>astype</code> 메서드는 열의 요소의 dtype을 변경하는함수 입니다.</p>
<p><code>dtype</code> : 변경할 type입니다.</p>
<p><code>copy</code> : 사본을 생성할지 여부입니다.</p>
<p><code>errors</code> : {&#39;raies&#39;, &#39;ignore&#39;} : 변경불가시 오류를 발생시킬 여부입니다.</p>
<p><strong>copy</strong>는 사본을 생성할지 여부 입니다. False로 할 경우 원본 데이터의 값이 변경 될 경우</p>
<p>원본 데이터를 사용해 생성된 객체의 데이터도 변경되기 때문에 False의 선택은 신중해야합니다.</p>
<p><strong>errors</strong>는 변경 불가능한 dtype일 경우 오류를 발생시킬지 여부입니다. False로 하여 오류를</p>
<p>발생시키지 않으면, 변경불가능한 요소는 원래 dtype 그대로 보존됩니다.</p>
<p>먼저, 아래와 같이 기본적인 4x4 행렬을 만듭니다. <code>col1</code>은 int64, <code>col2</code>는 object, <code>col3</code>은 float64, <code>col4</code>는 bool의 dtype을 가집니다.</p>
<pre><code class="language-python">col1 = [1, 2, 3, 4]
col2 = [&#39;one&#39;, &#39;two&#39;, &#39;three&#39;, &#39;four&#39;]
col3 = [1.5, 2.5, 3.5, 4.5]
col4 = [True, False, False, True]
index = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]
df = pd.DataFrame(index=index, data={&quot;col1&quot;: col1, &quot;col2&quot;: col2, &quot;col3&quot;: col3, &quot;col4&quot;: col4})
print(df)
&gt;&gt;
      col1   col2  col3   col4
row1     1    one   1.5   True
row2     2    two   2.5  False
row3     3  three   3.5  False
row4     4   four   4.5   True</code></pre>
<pre><code class="language-python">print(df.dtypes)
&gt;&gt;
col1      int64
col2     object
col3    float64
col4       bool
dtype: object</code></pre>
<p><strong>한개의 열만 type 변경</strong></p>
<p>열의 dtype 변경 시 딕셔너리 형태로 {&#39;열이름&#39; : &#39;변경 dtype&#39;}와 같이 입력해줍니다.</p>
<pre><code class="language-python">df1 = df.astype({&#39;col1&#39;:&#39;int32&#39;})# astype({바꿀값의 인덱스:바꿀갑})
print(df1.dtypes)
&gt;&gt;
col1      int32
col2     object
col3    float64
col4       bool
dtype: object</code></pre>
<p>int64 였던 col1의 dtype이 int32로 변경된 것을 확인할 수 있습니다.</p>
<p><strong>다수의 열의 dtype 변경</strong></p>
<p>다수의 열의 변경도 딕셔너리 형식을 이용하면 됩니다.</p>
<pre><code class="language-python">df1 = df.astype({&#39;col1&#39;:&#39;int32&#39;, &#39;col3&#39;:&#39;int64&#39;})#다수의 타입 변경은 콤마를 찍어주면 간단하다
print(df1.dtypes)
&gt;&gt;
col1     int32
col2    object
col3     int64
col4      bool
dtype: object
</code></pre>
<p>int64 였던 col1의 dtype이 int32로 변경되고 float64였던 col3의 dtype의 값이 int64로 변경된 것을 확인할 수 있습니다.</p>
<p><strong>모든 열의 dtype 변경</strong></p>
<p>모든열의 변경을 하고자하는 경우 dtype 인수에 원하는 dtype을 입력해주는 것만으로도 가능합니다.</p>
<pre><code class="language-python">df1= df.astype(dtype=&#39;int64&#39;)#모든 열을 변경하고자 하면 dtype에 변경하고자 하는 타입을 집어 넣으면 된다
print(df1.dtypes)
&gt;&gt;
ValueError: invalid literalfor int()with base 10: &#39;one&#39;
</code></pre>
<p>col2 : object형식은 int64형태로 변경할 수가 없기 때문에 오류가 발생합니다. 변경 가능한 열만 변경하려면, 아래와 같이 errors 인수를 기본값인 &#39;raise&#39; 에서 &#39;ignore&#39;로 변경하면 됩니다.</p>
<pre><code class="language-python">Copydf1= df.astype(dtype=&#39;int64&#39;,errors=&#39;ignore&#39;)#errors=&#39;ignore&#39;은 에러를 무시해준다
print(df1.dtypes)
&gt;&gt;
col1     int64
col2    object
col3     int64
col4     int64
dtype: object</code></pre>
<h2 id="열의-dtype통일-convert_dtypes"><strong>열의 dtype통일 (convert_dtypes)</strong></h2>
<p><code>convert_dtypes</code> 메서드는 열의 요소가 혼합된 dtype일 경우, 열의 요소를 같은 dtype으로 통일할 수 있는 가장 합리적인 형식을 갖는 <code>pd.NA</code>로 변환합니다.</p>
<p><code>infer_object</code> : dtype이 object인 경우 적절한 type으로 변경 할지의 여부입니다. 기본적으로 True이며,</p>
<p>이 경우 열의 요소를 확인해서 가장 적절한 dtype을 가진 pd.NA를 반환합니다.</p>
<p>convert_string, convert_integer, convert_boolean, convert_floating : 해당 유형으로의 pd.NA를 설정할지의 여부입니다.</p>
<p>기본적으로 True이기 때문에, 가능한 모든 dtype에 대해서 적절한 값을 반환합니다.</p>
<p>먼저, 아래와 같이 <code>NaN</code>이 포함된 3x4 행렬을 만듭니다.</p>
<p><code>col1</code>은 string, <code>col2</code>는 bool, <code>col3</code>, <code>col4</code>는 dtype을 가지지만, <code>NaN</code> 을 포함하기 때문에</p>
<p><code>col1</code>과 <code>col2</code>는 object 형식을 갖는것을 볼 수 있습니다.</p>
<pre><code class="language-python">**col1 = [&#39;a&#39;,&#39;b&#39;,np.nan]
col2 = [True, np.nan, False]
col3 = [np.nan, 2, 4]
col4 = [1.4, np.nan, 2.5]
df = pd.DataFrame(data={&#39;col1&#39;:col1,&#39;col2&#39;:col2,&#39;col3&#39;:col3,&#39;col4&#39;:col4},index=[&#39;row1&#39;,&#39;row1&#39;,&#39;row3&#39;])
print(df)
&gt;&gt;
     col1   col2  col3  col4
row1    a   True   NaN   1.4
row1    b    NaN   2.0   NaN
row3  NaN  False   4.0   2.5**</code></pre>
<pre><code class="language-python">print(df.dtypes)
&gt;&gt;
col1     object
col2     object
col3    float64
col4    float64
dtype: object</code></pre>
<p>이제 <code>df.convert_dtype</code>를 실행해서 가장 적절한 dtype으로 만들 수 있는</p>
<p><code>np.NA</code>를 추가해보겠습니다.</p>
<pre><code class="language-python">result = df.convert_dtypes()
print(result)
&gt;&gt;
#nan은 not a number이지만 na값은 다르다
      col1   col2  col3  col4
row1     a   True  &lt;NA&gt;   1.4
row1     b   &lt;NA&gt;     2  &lt;NA&gt;
row3  &lt;NA&gt;  False     4   2.5
</code></pre>
<p>위와 같이 기존 <code>NaN</code>들이 <code>NA</code> 형태로 변경된 것을 확인 할 수 있습니다.</p>
<p>그럼 이어서 dtype또한 변경되었는지 확인해보겠습니다.</p>
<pre><code class="language-python">print(result.dtypes)
&gt;&gt;
col1     string
col2    boolean
col3      Int64
col4    Float64
dtype: object
</code></pre>
<p>각 열의 dtype또한 기돈 object type에서 string, boolean, int64, float64로</p>
<p>각각에 맞게 변경된 것을 확인할 수 있습니다.</p>
<h2 id="object-열의-적절-dtype추론infer_objects"><strong>object 열의 적절 dtype추론(infer_objects)</strong></h2>
<p><code>infer_object</code>메서드는 dtype이 object인 열에 대해서 적당한 dtype을 추론합니다.</p>
<p>사용법을 참고 바랍니다.</p>
<p>먼저 str과 int가 혼합된 <code>col1</code>을 가진 DataFrame 객체를 만들어 dtype이 object인 열을 만들어 보겠습니다.</p>
<pre><code class="language-python">col1 = [&#39;a&#39;,&#39;b&#39;, 3, 4]
df = pd.DataFrame({&#39;col1&#39;:col1},index=[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;])
print(df)
print(df.dtypes)
&gt;&gt;
     col1
row1    a
row2    b
row3    3
row4    4

col1    object
dtype: object</code></pre>
<p>이제 <code>df</code>에서 형식이 int인 행만 남겨서 인덱싱을 한 뒤. dtype을 살펴보면, 여전히 dtype이 object인 것을 확인 할 수 있습니다.</p>
<pre><code class="language-python">df = df.iloc[2:]
print(df)
&gt;&gt;
     col1
row3    3
row4    4
</code></pre>
<pre><code class="language-python">print(df.dtypes)
&gt;&gt;
col1    object
dtype: object
</code></pre>
<p>이런 경우에 대해 <code>infer_object</code>는 가장 적당한 dtype을 제안하는 기능을 합니다.</p>
<pre><code class="language-python">print(df.infer_objects())
&gt;&gt;
      col1
row3     3
row4     4
</code></pre>
<pre><code class="language-python">print(df.infer_objects().dtypes)
&gt;&gt;
col1    int64
dtype: object
</code></pre>
<p>위와 같이 int형식만 남은 <code>df</code>의 <code>col1</code> 열에 대해 가장 적절한 dtype인 int64로 변환된 것을 확인할 수 있습니다.</p>
<h2 id="최대최소값이-포함된-행열-idxmax--idxmin"><strong>최대/최소값이 포함된 행/열 (idxmax / idxmin)</strong></h2>
<p><code>idxmax</code>와 <code>idxmin</code>은 각각 축에서 <code>최대/최소</code>값의 인덱스를 반환하는 메서드입니다.</p>
<p><code>axis</code> : {0 : index / 1:columns} 기준이 될 축입니다.</p>
<p><code>skipna</code> : 결측치의 무시 여부입니다. <code>True</code>면 결측치가 포함된 열은 무시하고 <code>False</code>면 <code>NaN</code>를 출력합니다.</p>
<pre><code class="language-python">n=np.nan
idx =  [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
col =  [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
data = [[1,2,200],[100,5,6],[7,300,n]]
df = pd.DataFrame(data, idx, col)
print(df)
&gt;&gt;
      col1  col2   col3
row1     1     2  200.0
row2   100     5    6.0
row3     7   300    NaN
</code></pre>
<p><code>axis=0</code>인경우(기본값) 열에서 <code>최대/최소</code> 값에 해당되는 행을 출력합니다.</p>
<pre><code class="language-python">print(df.idxmax(axis=0))
&gt;&gt;
col1    row2
col2    row3
col3    row1
dtype: object
</code></pre>
<pre><code class="language-python">print(df.idxmin(axis=0))
&gt;&gt;
col1    row1
col2    row1
col3    row2
dtype: object
</code></pre>
<p><code>axis=1</code>인경우 행에서 <code>최대/최소</code> 값에 해당되는 열을 출력합니다.</p>
<pre><code class="language-python">print(df.idxmax(axis=1))
&gt;&gt;
row1    col1
row2    col2
row3    col1
dtype: object
</code></pre>
<pre><code class="language-python">print(df.idxmin(axis=1))
&gt;&gt;
row1    col1
row2    col2
row3    col1
dtype: object
</code></pre>
<p><strong>skipna인수의 사용</strong></p>
<p><code>skipna</code>인수는 기본값이 <code>True</code>로 결측값이 포함된 행/열을 연산에서 무시합니다. <code>False</code>일 경우 <code>NaN</code>를 출력하게됩니다.</p>
<pre><code class="language-python">Copyprint(df.idxmax(axis=1,skipna=False))
&gt;&gt;
row1    col1
row2    col2
row3     NaN
dtype: object</code></pre>
<h2 id="비어있는지-확인-empty"><strong>비어있는지 확인 (empty)</strong></h2>
<p><code>empty</code>메서드는 DataFrame이 비어있는지 여부를 <code>bool</code> 형식으로 반환합니다.</p>
<p>여기서 비어있다는것은 정말 완전히 비어있는 상태를 말하는 것으로,</p>
<p><code>공백</code> 문자열(&quot;&quot;)이나 <code>Nan</code>의 경우조차 허용하지 않는것을 말합니다.</p>
<p>즉, 축이 존재하지 않는 경우를 말합니다.</p>
<p><code>공백</code>으로 이루어진 객체, <code>Nan</code>으로 이루어진 객체, 행이 없는 객체, 열이 없는객체로 확인해보겠습니다.</p>
<pre><code class="language-python">data_empty=[[&#39;&#39;,&#39;&#39;,&#39;&#39;],[&#39;&#39;,&#39;&#39;,&#39;&#39;],[&#39;&#39;,&#39;&#39;,&#39;&#39;]]
df = pd.DataFrame(data = data_empty, index = [&#39;row1&#39;, &#39;row2&#39;, &#39;row3&#39;], columns=[&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;])
print(df)
&gt;&gt;
     col1 col2 col3
row1
row2
row3
</code></pre>
<pre><code class="language-python">print(df.empty)

#행,열이 공백이기 때문에 false
&gt;&gt; False
</code></pre>
<p><code>공백</code>으로 이루어져있지만 <code>df.empty</code> 가 <code>False</code>로 출력됩니다.</p>
<p>&quot;&quot;으로 차있기 때문입니다.</p>
<p><strong>NaN으로 이루어진 객체</strong></p>
<pre><code class="language-python">df = pd.DataFrame(data = np.nan, index = [&#39;row1&#39;, &#39;row2&#39;, &#39;row3&#39;], columns=[&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;])
print(df)
&gt;&gt;
      col1  col2  col3
row1   NaN   NaN   NaN
row2   NaN   NaN   NaN
row3   NaN   NaN   NaN
</code></pre>
<pre><code class="language-python">print(df.empty)
#모두 결측값이기 때문에 false
&gt;&gt; False
</code></pre>
<p><code>NaN</code>으로 이루어진 객체 또한, 어쨌던 <code>Nan</code>으로 채워져 있기 때문에 <code>df.empty</code>값을 <code>False</code>로 반환합니다.</p>
<p><strong>행이나 열이 없는 객체</strong></p>
<p>열이없는경우</p>
<pre><code class="language-python">df1 = pd.DataFrame(index = [&#39;row1&#39;, &#39;row2&#39;, &#39;row3&#39;]) # 열이 없는 객체
print(df1)
&gt;&gt;
Empty DataFrame
Columns: [] #열이 없다
Index: [row1, row2, row3]#인덱스는 행 1,2,3밖에 없다
</code></pre>
<pre><code class="language-python">print(df1.empty)
#구성요소가 없기 때문에 true
&gt;&gt; True
</code></pre>
<p>행이 없는 경우</p>
<pre><code class="language-python">df2 = pd.DataFrame(columns=[&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]) # 행이 없는 객체
print(df2)
&gt;&gt;
Empty DataFrame
Columns: [col1, col2, col3]
Index: []
</code></pre>
<pre><code class="language-python">print(df2.empty)
&gt;&gt; True
</code></pre>
<p>행이나 열이 없는 경우는 아예 구성하는 요소가 없기 때문에 <code>df.empty</code>가 <code>True</code>로 반환되는것을 볼 수 있습니다.</p>
<h2 id="일치하는-요소-확인-isin"><strong>일치하는 요소 확인 (isin)</strong></h2>
<p><code>value</code> : Iterable, Series, DataFrame, dict등이 올 수 있습니다.</p>
<p>Series일 경우 : <code>Index</code>가 일치해야 합니다.</p>
<p>DataFrame일 경우 : <code>Index</code>와 <code>열 레이블</code>이 일치해야 합니다.</p>
<p>Dict일 경우 : <code>key</code>는 <code>열 레이블</code> 입니다.</p>
<pre><code class="language-python">data = [[1,1,1],[2,3,4],[5,3,6]]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
row = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
df = pd.DataFrame(data=data,index=row,columns=col)
print(df)
&gt;&gt;
      col1  col2  col3
row1     1     1     1
row2     2     3     4
row3     5     3     6
</code></pre>
<p><strong>list의 사용</strong></p>
<p>리스트를 이용하여 1과 3이 포함된 요소를 확인해보겠습니다.</p>
<pre><code class="language-python">result = df.isin([1,3])
print(result)
&gt;&gt;
#1,3일 경우 true를 반환함
       col1  col2   col3   
row1   True  True   True
row2  False  True  False
row3  False  True  False
</code></pre>
<p><strong>dict의 사용</strong></p>
<p><code>dict</code>를 사용해서 <code>col1</code>에서는 2,3인 경우, <code>col3</code>에서는 1,6이 포함된 요소를 확인해보겠습니다.</p>
<pre><code class="language-python">result = df.isin({&#39;col1&#39;:[2,3],&#39;col3&#39;:[1,6]})
print(result)
#col1에서는 2,3이 있는지 col3에서는 1,6이 있는지
&gt;&gt;
       col1   col2   col3
row1  False  False   True
row2   True  False  False
row3  False  False   True
</code></pre>
<p><strong>Series 와 DataFrame의 사용</strong></p>
<p>DataFrame객체를 사용하기위해 <code>match_df</code>라는 DataFrame객체를 하나 만들어보겠습니다.</p>
<pre><code class="language-python">match_col = [&#39;col1&#39;,&#39;col3&#39;]
match_row = [&#39;row1&#39;,&#39;row3&#39;]
match_data = [[2,3],[1,6]]
match_df = pd.DataFrame(data=match_data,index=match_row,columns=match_col)
print(match_df)
&gt;&gt;
      col1  col3
row1     2     3
row3     1     6
</code></pre>
<p>이제 이 <code>match_df</code>를 <code>value</code>로 <code>isin</code> 메서드를 사용해보겠습니다.</p>
<pre><code class="language-python">result = df.isin(match_df)
print(result)
&gt;&gt;
       col1   col2   col3   # match_df에 지정된 row,col의 값과 일치할 때만 True를 반환합니다.
row1  False  False  False
row2  False  False  False
row3  False  False   True</code></pre>
<h2 id="요소의-truefalse-확인-all--any"><strong>요소의 True/False 확인 (all / any)</strong></h2>
<p><code>all/any</code>는 축의 값들의 <code>True/False</code>여부를 판단하는 메서드입니다.</p>
<p><code>all</code>은 축의 값이 전부 <code>True</code>이면 <code>True</code>반환, 하나라도 <code>False</code>가 있으면 <code>False</code>를 반환합니다.</p>
<p><code>any</code>는 축의 값이 하나라도 <code>True</code>가 있으면 <code>True</code>반환, 전부 <code>False</code>이면 <code>False</code>를 반환합니다.</p>
<p><code>axis</code> : {0 : index / 1:columns} 기준이 될 축입니다.</p>
<p><code>bool_only</code> : <code>True</code>면 축의 모든 값이 bool인 경우에만 계산을 수행합니다. <code>None</code>면 모든 경우를 고려합니다.</p>
<p>예를들어 <code>0</code>과 공백()은 <code>False</code>로 고려되고 결측값(<code>pd.NA</code>)은 <code>True</code>로 고려되는 등 입니다.</p>
<p><code>skipna</code> : 결측치의 무시 여부입니다. <code>True</code>면 결측치가 포함된 열은 무시됩니다.</p>
<p><code>level</code> : Multi Index에서 레벨의 선택입니다.</p>
<p><code>kwargs</code> : 추가 키워드는 효과가 없지만 NumPy와의 호환성을 위해 허용될 수 있습니다.</p>
<pre><code class="language-python">[N,T,F]=[pd.NA,True,False]
idx = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]
data = {&#39;col1&#39;:[T,T,T,T], &#39;col2&#39;:[F,F,F,F],&#39;col3&#39;:[F,T,T,T],&#39;col4&#39;:[T,N,T,T],&#39;col5&#39;:[T,T,&#39;&#39;,T],&#39;col6&#39;:[T,T,T,0]}
df = pd.DataFrame(data=data, index=idx)
print(df)
&gt;&gt;
      col1   col2   col3  col4  col5  col6
row1  True  False  False  True  True  True
row2  True  False   True  &lt;NA&gt;  True  True
row3  True  False   True  True        True
row4  True  False   True  True  True     0
</code></pre>
<hr>
<p><strong>기본적인 사용법(all과 any 비교)</strong></p>
<p><code>all</code>은 축의 값이 전부 <code>True</code>면 <code>True</code>를 반환하고 <code>any</code>는 하나라도 <code>True</code>면 <code>True</code>를 반환합니다.</p>
<p><code>0</code>과 공백()은 <code>False</code>로, 결측값(<code>pd.NA</code>)은 <code>True</code>로 분류됩니다.</p>
<pre><code class="language-python">print(df.all())
&gt;&gt;
col1     True #모두 True
col2    False #모두 False
col3    False #1개가 Ture
col4     True #&lt;NA&gt;포함(나머지True)
col5    False #공백 포함(나머지True)
col6    False #0포함(나머지True)
dtype: bool
</code></pre>
<pre><code class="language-python">print(df.any())
&gt;&gt;
col1     True #모두 True
col2    False #모두 False
col3     True #1개가 Ture
col4     True #&lt;NA&gt;포함(나머지True)
col5     True #공백 포함(나머지True)
col6     True #0포함(나머지True)
dtype: bool
</code></pre>
<p><code>any</code>의 경우 하나라도<code>True</code>면 <code>True</code>를 반환하기때문에, <code>axis=1</code>로 하여 행 기준으로 실행하면, 모두 <code>True</code>를 반환하는것을 볼 수 있습니다.</p>
<pre><code class="language-python">print(df.any(axis=1))
&gt;&gt;
row1    True
row2    True
row3    True
row4    True
dtype: bool
</code></pre>
<p><strong>bool_only인수의 사용</strong></p>
<p><code>bool_only=True</code>일 경우 모든 요소가 bool형식인 경우만 계산됩니다.</p>
<pre><code class="language-python">print(df.all(bool_only=True))
&gt;&gt;
col1     True
col2    False
col3    False
dtype: bool
</code></pre>
<p><strong>skipna인수의 사용</strong></p>
<p><code>skipna=True</code>인 경우 결측치는 <code>True</code>로서 계산되며, <code>skipna=False</code>인 경우 결측치가 포함된 축이 계산에서 제외됩니다.</p>
<pre><code class="language-python">print(df.all(skipna=True))
&gt;&gt;
col1     True
col2    False
col3    False
col4     True
col5    False
col6    False
dtype: bool
</code></pre>
<pre><code class="language-python">print(df.all(skipna=False))
&gt;&gt;
col1     True
col2    False
col3    False
col5    False
col6    False
dtype: bool</code></pre>
<h2 id="결측값이-아닌-요소의-수-count"><strong>결측값이 아닌 요소의 수 (count)</strong></h2>
<p><code>count</code>메서드는 각 행/열에 결측치가 아닌 요소의 갯수를 구합니다.</p>
<p><code>axis</code> : 적용할 축입니다.</p>
<p><code>level</code> : Multi Index의 경우 레벨을 설정할 수 있습니다.</p>
<p><code>numeric_only</code> : <code>True</code>일 경우 <code>int</code>, <code>float</code>, <code>bool</code> 형태인 경우만 출력합니다.</p>
<pre><code class="language-python">[N,T,F]=[pd.NA,True,False]
idx = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]
data = {&#39;col1&#39;:[1,N,N,4.0],&#39;col2&#39;:[&#39;A&#39;,&#39;B&#39;,&#39;C&#39;,N],&#39;col3&#39;:[N,N,N,7],&#39;col4&#39;:[1,2.4,3.6,4]}
df = pd.DataFrame(data,idx)
print(df)
&gt;&gt;
      col1  col2  col3  col4
row1     1     A  &lt;NA&gt;   1.0
row2  &lt;NA&gt;     B  &lt;NA&gt;   2.4
row3  &lt;NA&gt;     C  &lt;NA&gt;   3.6
row4   4.0  &lt;NA&gt;     7   4.0
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p><code>axis</code>에 대해서 기본값은 <code>0</code>으로 열에 대해서 결측치가 아닌 값의 갯수를 구합니다.</p>
<pre><code class="language-python">print(df.count())
&gt;&gt;
col1    2
col2    3
col3    1
col4    4
dtype: int64
</code></pre>
<p><code>axis=1</code>인 경우 행에 대해서 결측치가 아닌 값의 갯수를 구합니다.</p>
<pre><code class="language-python">print(df.count(axis=1))
&gt;&gt;
row1    3
row2    2
row3    2
row4    3
dtype: int64
</code></pre>
<p><strong>numeric_only인수의 사용</strong></p>
<p><code>numeric_only=True</code>인 경우 <code>int</code>, <code>float</code>, <code>bool</code>로 구성된 행/열에 대해서만 계산값을 반환합니다.</p>
<pre><code class="language-python">print(df.count(numeric_only=True))
&gt;&gt;
col4    4
dtype: int64</code></pre>
<h2 id="일치-여부-equals"><strong>일치 여부 (equals)</strong></h2>
<p><code>equals</code>메서드는 두 객체가 완벽하게 동일한지를 확인하는 메서드입니다.</p>
<p><code>other</code> : <code>df</code>와 일치하는지 비교할 객체입니다.</p>
<p>먼저 2x2짜리 객체를3개 만들어보겠습니다.</p>
<p><code>df1</code>과 <code>df2</code>는 완벽하게 같고, <code>df3</code>는 <code>3</code>의 값이 <code>3.0</code>으로 <code>type</code>이 다릅니다.</p>
<pre><code class="language-python">df1 = pd.DataFrame(data=[[1,N],[3,T]])
df2 = pd.DataFrame(data=[[1,N],[3,T]])
print(df1)
&gt;&gt;
   0     1
0  1  &lt;NA&gt;
1  3  True
</code></pre>
<pre><code class="language-python">df3 = pd.DataFrame(data=[[1,N],[3.0,T]])
print(df3)
&gt;&gt;
     0     1
0  1.0  &lt;NA&gt;
1  3.0  True
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p>두 객체가 완벽히 같을경우 <code>True</code>를 반환하며 다를경우 <code>False</code>를 반환합니다. 요소의 <code>type</code>이 다르더라도 <code>False</code>를 반환합니다.</p>
<pre><code class="language-python">print(df1.equals(df2))
&gt;&gt;
#df1과 df2를 비교하여 데이터 타입이 같은지 확인한다
True
</code></pre>
<pre><code class="language-python">print(df1.equals(df3))
&gt;&gt;
False</code></pre>
<h2 id="1칸-객체의-bool-확인-bool"><strong>1칸 객체의 bool 확인 (bool)</strong></h2>
<p><code>bool</code> 메서드는 1칸짜리 Series나 DataFrame에 대해서 bool 값의 <code>True</code> or <code>False</code>여부를 확인합니다.</p>
<p>값이 <code>bool</code>이 아니거나 1칸이 아니라면 <code>Value Error</code>를 발생시킵니다.</p>
<p>먼저 1x1짜리 이며 값이 <code>bool</code>인 DataFrame객체를 2개 만들어보겠습니다.</p>
<p><code>df1</code>은 <code>True</code>, <code>df2</code>는 <code>False</code>입니다.</p>
<pre><code class="language-python">df1 = pd.DataFrame([True],[&#39;row&#39;],[&#39;col&#39;])
print(df1)
&gt;&gt;
      col
row  True
</code></pre>
<pre><code class="language-python">df2 = pd.DataFrame([False],[&#39;row&#39;],[&#39;col&#39;])
print(df2)
&gt;&gt;
       col
row  False
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p>1칸짜리 객체의 <code>bool</code>값을 그대로 반환하게 됩니다.</p>
<pre><code class="language-python">print(df1.bool( ))
&gt;&gt;
True
</code></pre>
<pre><code class="language-python">print(df2.bool( ))
&gt;&gt;
False</code></pre>
<h2 id="중복행-확인-duplicated"><strong>중복행 확인 (duplicated)</strong></h2>
<p><code>duplicated</code> 메서드는 중복되는 행을 확인하는 메서드입니다.</p>
<p>행의 모든 요소가 동일한 행이 이미 존재할경우 해당 행은 <code>True</code>로 반환됩니다.</p>
<p><code>subset</code> : 특정 열만을 대상으로 할 수 있습니다. <code>list</code>의 사용도 가능합니다.</p>
<p><code>keep</code> : {first : 위부터 검사 / last : 아래부터 검사} 검사 순서를 정합니다. first일 경우 위부터 확인해서 중복행이 나오면 <code>True</code>를 반환하며, last일 경우 아래부터 확인합니다.</p>
<pre><code class="language-python">idx = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;,&#39;row5&#39;]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
data= [[&#39;A&#39;,&#39;가&#39;,1],[&#39;A&#39;,&#39;가&#39;,1],[&#39;A&#39;,&#39;나&#39;,2],[&#39;B&#39;,&#39;나&#39;,3],[&#39;B&#39;,&#39;다&#39;,4]]
df = pd.DataFrame(data, idx, col)
print(df)
&gt;&gt;
     col1 col2  col3
row1    A    가     1
row2    A    가     1
row3    A    나     2
row4    B    나     3
row5    B    다     4
</code></pre>
<hr>
<p><strong>기본적인 사용법</strong></p>
<p>기본적으로 <code>keep=&#39;first&#39;</code>이며 위에서부터 행을 확인하여 중복인 행이 나오면 <code>True</code>를 반환합니다.</p>
<pre><code class="language-python">print(df.duplicated(keep=&#39;first&#39;))
&gt;&gt;
row1    False
row2     True # row1과 row2는 모든 요소가 같고, 위에서부터 확인시 row2가 중복값이 됩니다. -&gt; True반환
row3    False
row4    False
row5    False
dtype: bool
</code></pre>
<p><code>keep=&#39;last&#39;</code>일 경우 아래부터 행을 확인하여 중복인 행이 나오면 <code>True</code>를 반환합니다.</p>
<pre><code class="language-python">print(df.duplicated(keep=&#39;last&#39;))
&gt;&gt;
row1     True # row1과 row2는 모든 요소가 같고, 아래에서부터 확인시 row1가 중복값이 됩니다. -&gt; True반환
row2    False
row3    False
row4    False
row5    False
dtype: bool
</code></pre>
<p><strong>subset으로 특정 열만 확인</strong></p>
<p><code>subset</code>을 이용하여 특정 열을 대상으로만 중복행의 확인이 가능합니다.</p>
<pre><code class="language-python">print(df.duplicated(subset=[&#39;col1&#39;,&#39;col3&#39;]))
&gt;&gt;
row1    False
row2     True
row3     True
row4    False
row5     True
dtype: bool</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-04-15]]></title>
            <link>https://velog.io/@smile_07/2025-04-15</link>
            <guid>https://velog.io/@smile_07/2025-04-15</guid>
            <pubDate>Tue, 15 Apr 2025 11:17:53 GMT</pubDate>
            <description><![CDATA[<h1 id="2025-04-15">2025-04-15</h1>
<h2 id="lociloc의-활용">loc,iloc의 활용</h2>
<pre><code class="language-python">data = [
    [&quot;037730&quot;, &quot;3R&quot;, 1510, 7.36],
    [&quot;036360&quot;, &quot;3SOFT&quot;, 1790, 1.65],
    [&quot;005760&quot;, &quot;ACTS&quot;, 1185, 1.28],
]
columns = [&quot;종목코드&quot;, &quot;종목명&quot;, &quot;현재가&quot;, &quot;등락률&quot;]
df = pd.DataFrame(data=data, columns=columns)
df.set_index(&#39;종목코드&#39;, inplace=True)
&gt;&gt;
          종목명   현재가   등락률
종목코드                     
037730     3R  1510  7.36
036360  3SOFT  1790  1.65
005760   ACTS  1185  1.28

#데이터프레임에서 현재가 열만 출력하기
df[&#39;현재가&#39;]
&gt;&gt;
    현재가
종목코드    
037730    1510
036360    1790
005760    1185

dtype: int64
#데이터프레임에서 037730 종목 데이터 인덱싱하기
print(df.loc[&#39;037730&#39;,])

#loc 멀티 인덱싱
df.loc[[&quot;037730&quot;, &quot;005760&quot;]]
    종목명    현재가    등락률
종목코드            
037730    3R    1510    7.36
005760    ACTS    1185    1.28
#iloc를 사용하여 특정 값 가져오기
df.iloc[0,2]
&gt;&gt;
np.float64(7.36)
#위 데이터프레임에서 iat과 at 속성을 사용하여 037730 종목의 등락률을 출력하세요
df.iat [0,2]
&gt;&gt;
np.float64(7.36)

#loc로 등락률 출력
print(df.loc[&#39;037730&#39;,&#39;등락률&#39;])
&gt;&gt;
7.36
#iloc속성을 사용하여 첫번째, 두번째 행을 슬라이싱하세요
df.iloc[0:2]
&gt;&gt;
    종목명    현재가    등락률
종목코드            
037730    3R    1510    7.36
036360    3SOFT    1790    1.65
#loc 속성을 이용하여 첫번쨰, 두번째 행을 슬라이싱하기
df.loc[[&quot;037730&quot;:&quot;036360&quot;]]
&gt;&gt;
    종목명    현재가    등락률
종목코드            
037730    3R    1510    7.36
036360    3SOFT    1790    1.65
#위 데이터프레임에서 iloc 속성을 사용하여 첫 번쨰 컬럼을 인덱싱하세요
df.iloc[:,0]
&gt;&gt;
    종목명
종목코드    
037730    3R
036360    3SOFT
005760    ACTS
#loc속성을 사용하여 첫 번째 컬러을 인덱상하세요
df.loc[:,&#39;종목명&#39;]
&gt;&gt;
 종목명
종목코드    
037730    3R
036360    3SOFT
005760    ACTS
#loc 속성을 사용하여 037730 종목의 &#39;종목명&#39;,&#39;현재가&#39;컬럼을 선택하세요
df.loc[&#39;037730&#39;,[&#39;종목명&#39;,&#39;현재가&#39;]]
&gt;&gt;
    037730
종목명    3R
현재가    1510

#iloc 속성을 사용하여 037730 종목의 &#39;종목명&#39;,&#39;현재가&#39;컬럼을 선택하세요
df.iloc[0,[0,1]]
&gt;&gt;
037730
종목명    3R
현재가    1510
#loc 속성을 사용하여 다음 범위를 가져오세요(2행3열까지
df.loc[[&#39;037730&#39;,&#39;036360&#39;],[&#39;종목명&#39;,&#39;현재가&#39;]])
    종목명    현재가
종목코드        
037730    3R    1510
036360    3SOFT    1790
#iloc 속성을 사용하여 다음 범위를 가져오세요(2행3열까지
df.iloc[[0,1],[0,1]]
&gt;&gt;
    종목명    현재가
종목코드        
037730    3R    1510
036360    3SOFT    1790</code></pre>
<h2 id="filternamedropnarename컬럼인덱스변경추가활용">filter,name,dropna,rename(컬럼,인덱스변경)추가활용</h2>
<p>(데이터프레임은 위에서 쓰던거 계속 사용)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-04-14]]></title>
            <link>https://velog.io/@smile_07/2025-04-14</link>
            <guid>https://velog.io/@smile_07/2025-04-14</guid>
            <pubDate>Mon, 14 Apr 2025 10:57:37 GMT</pubDate>
            <description><![CDATA[<h2 id="열-삽입insert">열 삽입(insert)</h2>
<h1 id="09-01-열-삽입-insert"><strong>09-01. 열 삽입 (insert)</strong></h1>
<p><code>insert</code> 메서드는 DataFrame의 특정 위치에 열을 삽입하는 메서드입니다..</p>
<p>DataFrame에 해당 열이 이미 존재 할 경우 <code>allow_duplicates=True</code>가 아니면 Value Errer를 발생시킵니다.</p>
<p>df.insert(loc, column, value, allow_duplicates=False)</p>
<p><code>loc</code> : 삽입될 열의 위치</p>
<p><code>column</code> : 삽입될 열의 이름</p>
<p><code>val</code> : 삽입될 열의 값</p>
<p><code>allow_duplicates</code> : {True or False} 기본값은 False로 True일경우 중복 열의 삽입을 허용합니다.</p>
<pre><code class="language-python">data = [[1,2,3],[4,5,6],[7,8,9]]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
row = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
df = pd.DataFrame(data=data,index=row,columns=col)
print(df)
&gt;&gt;
      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9
</code></pre>
<hr>
<p><code>loc</code>=3으로해서 4열로 설정, <code>column</code>을 통해 이름을 <code>col4</code>로하고 <code>value</code>로 값을 설정하여 열을 추가해보겠습니다.</p>
<pre><code class="language-python">df.insert(3,&#39;col4&#39;,[10,11,12])#col4라는 열을 10,11,12로 삽입한다
print(df)
&gt;&gt;
      col1  col2  col3  col4
row1     1     2     3    10
row2     4     5     6    11
row3     7     8     9    12
</code></pre>
<p>col4가 3번열에 추가된 것을 확인할 수 있습니다. (0번부터 시작하기 때문에 3번 열은 4번째 열입니다.)</p>
<p>그럼 이미 추가되어있는 &#39;col3&#39;을 추가하면 어떻게 될까요? 바로 오류를 발생시키게 됩니다.</p>
<pre><code class="language-python">df.insert(3,&#39;col3&#39;,[10,11,12],allow_duplicates=False)
print(df)
&gt;&gt;
ValueError: cannot insert col3, already exists
</code></pre>
<p>여기서 allow_duplicates=True하면 중복된 이름으로 col3이 추가되는것을 확인 할 수 있습니다.</p>
<pre><code class="language-python">df.insert(3,&#39;col3&#39;,[10,11,12],allow_duplicates=True)
print(df)
&gt;&gt;
      col1  col2  col3  col3
row1     1     2     3    10
row2     4     5     6    11
row3     7     8     9    12</code></pre>
<h1 id="열-꺼내기pop">열 꺼내기(pop)</h1>
<p><code>pop</code>메서드는 DataFrame에서 열 레이블을 꺼냅니다. 즉, 원본 DataFrame에서 해당 열이 제거됩니다.</p>
<p>df.pop(item)</p>
<p><code>item</code> : 꺼낼 열의 이름입니다.</p>
<pre><code class="language-jsx">data = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;]
row = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]
df = pd.DataFrame(data=data,index=row,columns=col)
print(df)

      col1  col2  col3  col4
row1     1     2     3     4
row2     5     6     7     8
row3     9    10    11    12
row4    13    14    15    16</code></pre>
<p>item에 col3을 입력하여 열을 꺼내보겠숩나다.</p>
<p><code>pop</code>한 것을 변수에 넣어 출력해 보면 해당 열이 출력 되는것을 확인 할 수 있습니다.</p>
<pre><code class="language-jsx">item = df.pop(&#39;col3&#39;)
print(item)

row1     3
row2     7
row3    11
row4    15
Name: col3, dtype: int64</code></pre>
<p>원본이었던 df는 어떻게 되었을까요? pop함수는 원본에서 꺼낸다는 의미이기 때문에, <code>col3</code>이 원본에서 삭제된것을 알 수 있습니다.</p>
<pre><code class="language-jsx">print(df)
&gt;&gt;
      col1  col2  col4
row1     1     2     4
row2     5     6     8
row3     9    10    12
row4    13    14    16</code></pre>
<h2 id="복사-copy"><strong>복사 (copy)</strong></h2>
<h2 id="개요"><strong>개요</strong></h2>
<p>Pandas객체를 복사합니다. deep copy와 shallow copy기능을 지원합니다.</p>
<p><code>deep</code> : {True or False} 기본값 True</p>
<p><code>deep</code> = <code>True</code>인 경우를 <strong>deep copy</strong>라고 하며 원본과는 완전하게 별개인 복사본이 생성됩니다. 사본과 원본의 수정은 서로에게 영향을 끼치지 않습니다.</p>
<p><code>deep</code> = <code>False</code>인 경우를 <strong>shallow copy</strong>라고 하며 원본의 데이터 및 인덱스를 복사하지않고 새 객체를 호출합니다.</p>
<p>즉, 원본의 데이터가 수정되면 사본의 데이터도 수정되며, 그 반대도 마찬가지 입니다.</p>
<p>먼저, 아래와 같이 series객체를 하나 만들고, deep copy본과 shallow copy본인 객체를 생성해봅니다.</p>
<pre><code class="language-jsx">sr = pd.Series([1, 2], index=[&quot;col1&quot;, &quot;col2&quot;])
deep = sr.copy(deep=True)
shallow = sr.copy(deep=False)
print(sr)

col1    1
col2    2
dtype: int64</code></pre>
<p>이제 원본인 sr과 deep copy본인 deep, shallow copy본인 shallow의 요소를 변경하고 다시 출력해보겠습니다.</p>
<pre><code class="language-python">sr[0] = 9
shallow[1] = 8
deep[1]=7
</code></pre>
<p><strong>원본 출력시</strong></p>
<p>shallow에서 변경한 내용이 원본인 sr에도 적용된 것을 확인할 수 있습니다.</p>
<pre><code class="language-python">Copyprint(sr)
&gt;&gt;
col1    9
col2    8
dtype: int64</code></pre>
<p><strong>shallow copy본 출력시</strong></p>
<p>sr에서 변경한 내용이 사본인 shallow에도 적용된 것을 확인할 수 있습니다.</p>
<pre><code class="language-python">print(shallow)

col1    9
col2    8
dtype: int64</code></pre>
<p><strong>deep copy본 출력시</strong></p>
<p>원본이나 다른 사본의 변경내용과 무관하게 자기 자신의 변경내용만이 적용된 것을 확인할 수 있습니다.</p>
<pre><code class="language-python">print(deep)
col1    1
col2    7
dtype: int64</code></pre>
<h2 id="dataframe의-경우"><strong>DataFrame의 경우</strong></h2>
<p>마찬가지로 기본적인 3x3 DataFrame객체를 생성해보겠습니다.</p>
<pre><code class="language-python">col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
row = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
df = pd.DataFrame(data=[[1,2,3],[4,5,6],[7,8,9]],index=row,columns=col)
deep = df.copy(deep=True)
shallow = df.copy(deep=False)
</code></pre>
<pre><code class="language-python">print(df)
&gt;&gt;
      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9
</code></pre>
<p>이제 원본과 copy본의 값을 아래와 같이 변경하고 출력해보겠습니다.</p>
<pre><code class="language-python">df[&#39;col1&#39;][&#39;row1&#39;]=99
shallow[&#39;col2&#39;][&#39;row2&#39;]=88
deep[&#39;col2&#39;][&#39;row2&#39;]=77
</code></pre>
<p><strong>원본 출력시</strong></p>
<pre><code class="language-python">print(df)
#shallow에서 변경한 내용이 원본인 df에도 적용된 것을 확인할 수 있습니다.
      col1  col2  col3
row1    99     2     3
row2     4    88     6
row3     7     8     9
</code></pre>
<p><strong>shallow copy본 출력시</strong></p>
<pre><code class="language-python">print(shallow)
#df에서 변경한 내용이 사본인 shallow에도 적용된 것을 확인할 수 있습니다.
      col1  col2  col3
row1    99     2     3
row2     4    88     6
row3     7     8     9
</code></pre>
<p><strong>deep copy본 출력시</strong></p>
<pre><code class="language-python">Copyprint(deep)
#원본이나 다른 사본의 변경내용과 무관하게 자기 자신의 변경내용만이 적용된 것을 확인할 수 있습니다.
      col1  col2  col3
row1     1     2     3
row2     4    77     6
row3     7     8     9</code></pre>
<h2 id="행열-삭제-drop"><strong>행/열 삭제 (drop)</strong></h2>
<p><code>drop</code>메서드는 데이터프레임에서 열을 삭제하는 메서드입니다.</p>
<p><code>pop</code>메서드와는 다르게 원본이 변경되지 않습니다.</p>
<p><code>labels</code> : 삭제할 레이블명입니다. <code>axis</code>를 지정해주어야합니다.</p>
<p><code>axis</code> : {0 : index / 1 : columns} <code>labels</code>인수를 사용할경우 지정할 축입니다.</p>
<p><code>index</code> : 인덱스명을 입력해서 바로 삭제를 할 수 있습니다.</p>
<p><code>columns</code> : 컬럼명을 입력해서 바로 삭제를 할 수 있습니다.</p>
<p><code>level</code> : 멀티인덱스의 경우 레벨을 지정해서 진행할 수 있습니다.</p>
<p><code>inplace</code> : 원본을 변경할지 여부입니다. <code>True</code>일경우 원본이 변경됩니다.</p>
<p><code>errors</code> : 삭제할 레이블을 찾지 못할경우 오류를 띄울지 여부입니다. <code>ignore</code>할 경우 존재하는 레이블만 삭제됩니다.</p>
<p>※ <code>axis=0</code> + <code>labels</code> 는 <code>index</code>인수와 역할이 같고 <code>axis=1</code> + <code>labels</code>는 <code>columns</code>와 역할이 같습니다.</p>
<pre><code class="language-python">sr = pd.Series([1, 2], index=[&quot;col1&quot;, &quot;col2&quot;])
deep = sr.copy(deep=True)
shallow = sr.copy(deep=False
print(sr)
&gt;&gt;
col1    1
col2    2
dtype: int64</code></pre>
<p>이제 원본인 sr과 deep copy본인 deep, shallow copy본인 shallow의 요소를 변경하고 다시 출력해보겠습니다.</p>
<pre><code class="language-python">row = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
data = [[1,2,3],[4,5,6],[7,8,9]]
df = pd.DataFrame(data=data, index=row, columns=col)
print(df)
      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9</code></pre>
<p><strong>labels인수와 axis인수로 삭제</strong></p>
<p><code>labels</code>인수로 삭제할 레이블명을 지정해주게되면, <code>axis</code>인수를 통해 해당 레이블(축)을 지정해주어야합니다.</p>
<p><code>row2</code> 를 삭제해보겠습니다.</p>
<pre><code class="language-python">print(df.drop(labels=&#39;row2&#39;,axis=0))
          col1  col2  col3
row1     1     2     3
row3     7     8     9</code></pre>
<p><code>col2</code>를 삭제해보겠습니다.</p>
<pre><code class="language-python">print(df.drop(labels=&#39;col2&#39;,axis=1))
      col1  col3
row1     1     3
row2     4     6
row3     7     9</code></pre>
<p><strong>index인수와 columns 인수로 삭제</strong></p>
<p><code>index</code>인수와 <code>columns</code>인수를 사용하면 <code>labels</code>인수와 <code>axis</code> 사용 없이 삭제가 가능합니다.</p>
<p><code>index</code>를 사용해서 <code>row3</code>을 삭제해보겠습니다.</p>
<pre><code class="language-python">print(df.drop(index=&#39;row3&#39;))

      col1  col2  col3
row1     1     2     3
row2     4     5     6
</code></pre>
<p><code>columns</code>를 이용해 <code>col3</code>을 삭제해보겠습니다.</p>
<pre><code class="language-python">print(df.drop(columns=&#39;col3&#39;))
      col1  col2
row1     1     2
row2     4     5
row3     7     8</code></pre>
<p><strong>errors인수 예시</strong></p>
<p>삭제하고자하는 레이블이 존재하지 않으면 오류가 발생하게됩니다. <code>errors=&#39;ignore&#39;</code>로 설정하면 오류를 발생하지 않습니다.</p>
<p><code>row3</code>, <code>row4</code>를 삭제해보겠습니다.(<code>row4</code>는 존재하지 않음)</p>
<pre><code class="language-python">print(df.drop(labels=[&#39;row3&#39;,&#39;row4&#39;],errors=&#39;raise&#39;))

KeyError: &quot;[&#39;row4&#39;] not found in axis&quot;
</code></pre>
<p><code>row4</code>가 존재하지 않기 때문에 오류가 발생하였습니다. <code>errors=&#39;ignore&#39;</code>로 실행해보겠습니다.</p>
<pre><code class="language-python">print(df.drop(labels=[&#39;row3&#39;,&#39;row4&#39;],errors=&#39;ignore&#39;))

      col1  col2  col3
row1     1     2     3
row2     4     5     6
</code></pre>
<p>오류없이 존재하는 <code>row3</code>이 삭제된 것을 확인할 수 있습니다.</p>
<p><strong>inplace인수로 원본 변경</strong></p>
<p><code>inplace</code>인수는 Pandas객체의 공통사항으로 원본의 변경여부를 의미합니다.</p>
<p><code>True</code>일 경우 반환값 없이 원본이 변경됩니다.</p>
<pre><code class="language-python">df.drop(labels=[&#39;col1&#39;,&#39;col2&#39;],axis=1,inplace=True)
print(df)

      col3
row1     3
row2     6
row3     9</code></pre>
<h2 id="행-추가-append"><strong>행 추가 (append)</strong></h2>
<p><code>append</code> 메서드는 데이터프레임에 행을 추가하는 메서드입니다.</p>
<p>두 데이터프레임 객체를 행 기준으로 합치는 개념입니다.</p>
<p><strong>기본 사용</strong></p>
<p><code>other</code> : <code>self</code> 객체에 행 기준으로 합칠 객체입니다.</p>
<p><code>ignore_index</code> : 기존 인덱스를 사용할지 여부 입니다. <code>False</code>로 할 경우 0,1,2,..,n 이 부여됩니다.</p>
<p><code>verify_integrity</code> : 합칠 때 이름이 중복되는 인덱스가 있을 경우 오류를 발생시킬지 여부 입니다.</p>
<p><code>sort</code> : 열을 사전적으로 정렬할 지 여부입니다.</p>
<pre><code class="language-python">df = pd.DataFrame(data=[[1,2],[3,4]], index=[&#39;row1&#39;,&#39;row2&#39;], columns=[&#39;col1&#39;,&#39;col3&#39;])
print(df)
&gt;&gt;
      col1  col3
row1     1     2
row2     3     4</code></pre>
<p><strong>기본적인 사용법(+sort, ignore_index)</strong></p>
<p>먼저 간단한 <code>df2</code>를 만들어 pd.concat로 <code>df</code>와 합쳐보겠습니다.</p>
<pre><code class="language-python">df2 = pd.DataFrame(data=[[5,6]],index=[&#39;row3&#39;],columns=[&#39;col2&#39;,&#39;col4&#39;])
print(df2)
&gt;&gt;
      col2  col4
row3     5     6</code></pre>
<pre><code class="language-python">print(pd.concat([df,df2]))#리스트 형태로 해줘야 한다
&gt;&gt;
      col1  col3  col2  col4
row1   1.0   2.0   NaN   NaN
row2   3.0   4.0   NaN   NaN
row3   NaN   NaN   5.0   6.0
</code></pre>
<p><code>row3</code>이 행추가 되었고 기존<code>df</code>에는 없던 <code>col2</code>과 <code>col4</code>가 생성된것을 확인할 수 있습니다.</p>
<p><code>sort</code>인수를 사용하면 열을 사전적으로 정렬 할 수 있습니다.</p>
<pre><code class="language-python">print(pd.concat([df,df2],sort=True))
      col1  col2  col3  col4
row1   1.0   NaN   2.0   NaN
row2   3.0   NaN   4.0   NaN
row3   NaN   5.0   NaN   6.0
</code></pre>
<p><code>ignore_index</code>인수를 사용하면 기존 index를 무시할 수 있습니다.</p>
<pre><code class="language-python">print(pd.concat([df,df2],sort=True,ignore_index=True))

   col1  col2  col3  col4
0   1.0   NaN   2.0   NaN
1   3.0   NaN   4.0   NaN
2   NaN   5.0   NaN   6.0
</code></pre>
<p><strong>verify_integrity인수의 사용</strong></p>
<p><code>verify_integrity</code> 인수를 <code>True</code>로 설정하면 이름이 중복되는 인덱스가 존재할 경우 오류를 발생시킵니다.</p>
<p>먼저 중복되는 인덱스가 있는 2x2 객체를 하나 생성하겠습니다.</p>
<pre><code class="language-python">df3 = pd.DataFrame(data=[[7,8],[9,0]], index=[&#39;row2&#39;,&#39;row3&#39;], columns=[&#39;col1&#39;,&#39;col3&#39;])
print(df3)
&gt;&gt;
      col1  col3
row2     7     8
row3     9     0
</code></pre>
<p><code>verify_integrity</code>가 <code>False</code>일 경우 (기본값)</p>
<pre><code class="language-python">print(pd.concat([df,df3],verify_integrity=False))
&gt;&gt;
      col1  col3
row1     1     2
row2     3     4
row2     7     8
row3     9     0
</code></pre>
<p><code>verify_integrity</code>가 <code>True</code>일 경우</p>
<pre><code class="language-python">Copyprint(pd.concat([df,df3],verify_integrity=True))
&gt;&gt;
오류발생
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
&lt;ipython-input-57-5460e119f181&gt; in &lt;cell line: 0&gt;()
----&gt; 1 Copyprint(pd.concat([df,df3],verify_integrity=True))

NameError: name &#39;Copyprint&#39; is not defined
</code></pre>
<h2 id="자르기-truncate"><strong>자르기 (truncate)</strong></h2>
<p><code>turncate</code>메서드는 행이나 열에 대해서 앞뒤를 자르는 메서드 입니다.</p>
<p>df.truncate(before=None, after=None, axis=None, copy=True)</p>
<p><code>before</code> : 이 기준 이전을 삭제합니다.</p>
<p><code>after</code> : 이 기준 이후를 삭제합니다.</p>
<p><code>axis</code> : 자를 축 입니다.</p>
<p><code>copy</code> : 사본을 생성할지 여부입니다.</p>
<pre><code class="language-python">row = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;]
data = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
df = pd.DataFrame(data=data, index=row, columns=col)
print(df)
&gt;&gt;
      col1  col2  col3  col4
row1     1     2     3     4
row2     5     6     7     8
row3     9    10    11    12
row4    13    14    15    16</code></pre>
<p><code>before</code>, <code>after</code>, <code>axis</code>를 이용하여 앞뒤를 잘라보겠습니다.</p>
<pre><code class="language-python">print(df.truncate(before=&#39;row2&#39;,after=&#39;row3&#39;,axis=0))
#행 자르기 (row2 이전, row3이후 자르기
      col1  col2  col3  col4
row2     5     6     7     8
row3     9    10    11    12
</code></pre>
<pre><code class="language-python">print(df.truncate(before=&#39;col2&#39;,after=&#39;col3&#39;,axis=1))
#열 자르기 (col2 이전, col3이후 자르기)
      col2  col3
row1     2     3
row2     6     7
row3    10    11
row4    14    15</code></pre>
<h2 id="중복행-제거-drop_duplicates"><strong>중복행 제거 (drop_duplicates)</strong></h2>
<p><code>drop_duplicates</code>메서드는 내용이 중복되는 행을 제거하는 메서드입니다.</p>
<p><code>subset</code> : 중복값을 검사할 열 입니다. 기본적으로 모든 열을 검사합니다.</p>
<p><code>keep</code> : {first / last} 중복제거를할때 남길 행입니다. first면 첫값을 남기고 last면 마지막 값을 남깁니다.</p>
<p><code>inplace</code> : 원본을 변경할지의 여부입니다.</p>
<p><code>ignore_index</code> : 원래 index를 무시할지 여부입니다. <code>True</code>일 경우 0,1,2, ... , n으로 부여됩니다.</p>
<pre><code class="language-python">col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
data = [[&#39;A&#39;,&#39;x&#39;,&#39;-&#39;],[&#39;A&#39;,&#39;x&#39;,&#39;-&#39;],[&#39;B&#39;,&#39;x&#39;,&#39;앞&#39;],[&#39;B&#39;,&#39;y&#39;,&#39;-&#39;],[&#39;B&#39;,&#39;y&#39;,&#39;뒤&#39;]]
df = pd.DataFrame(data=data, columns=col)
print(df)
&gt;&gt;
  col1 col2 col3
0    A    x    -
1    A    x    -
2    B    x    앞
3    B    y    -
4    B    y    뒤
</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p><code>subset</code>에 입력된 컬럼명을 기준으로 해당 컬럼의 중복값을 검사하게됩니다.</p>
<p><code>subset</code>이 따로 입력되지 않는 경우는 모든 열에대해 값이 중복인 행을 제거합니다.</p>
<pre><code class="language-python">Copyprint(df.drop_duplicates())
# 모든 요소가 중복인 0행과 1행중 1행이 삭제됨(처음값 남기는게 기본)
  col1 col2 col3 
0    A    x    -
2    B    x    앞
3    B    y    -
4    B    y    뒤</code></pre>
<p><code>subset</code>에 특정 컬럼명만 입력할 경우, 해당 열에대해서만 중복값 검사를 수행합니다.</p>
<pre><code class="language-python">print(df.drop_duplicates(subset=&#39;col2&#39;))
&gt;&gt;
  col1 col2 col3 # col2에서 x와 y에대해서 중복값들 제거
0    A    x    -
3    B    y    -
</code></pre>
<p><code>subset</code>에 리스트를 입력할 경우 해당 열들에대해서 모두 중복인 경우만 삭제를 진행합니다.</p>
<pre><code class="language-python">print(df.drop_duplicates(subset=[&#39;col1&#39;,&#39;col2&#39;]))
&gt;&gt;
  col1 col2 col3
0    A    x    -
2    B    x    앞
3    B    y    -
</code></pre>
<p><strong>keep인수를 통해 남길 행 선택</strong></p>
<p><code>keep</code>인수를 통해서 중복값을 제거하고 남길 행을 선택할 수 있습니다.</p>
<p><code>keep=&#39;first&#39;</code>인 경우 처음 값을 남깁니다. (기본값)</p>
<pre><code class="language-python">print(df.drop_duplicates(subset=&#39;col1&#39;,keep=&#39;first&#39;))
&gt;&gt;
  col1 col2 col3
0    A    x    -
2    B    x    앞
</code></pre>
<p><code>keep=&#39;last&#39;</code>인 경우 마지막 값을 남깁니다.</p>
<pre><code class="language-python">print(df.drop_duplicates(subset=&#39;col1&#39;,keep=&#39;last&#39;))
&gt;&gt;
  col1 col2 col3
1    A    x    -
4    B    y    뒤
</code></pre>
<p>추가로 <code>ignore_index=True</code>로 할 경우 결과값의 인덱스를 0, 1, 2, ... , n으로 설정합니다.</p>
<pre><code class="language-python">print(df.drop_duplicates(subset=&#39;col1&#39;,keep=&#39;last&#39;,ignore_index=True))
&gt;&gt;
  col1 col2 col3 #인덱스가 0, 4에서 0, 1로 정리됩
0    A    x    -
1    B    y    뒤
</code></pre>
<p><strong>inplace 인수의 사용</strong></p>
<p>Pandas 공통사항으로 <code>inplace</code>인수를 사용할 경우 원본에 변경이 적용됩니다.</p>
<pre><code class="language-python">df.drop_duplicates(subset=&#39;col3&#39;,inplace=True)
print(df)
&gt;&gt;
  col1 col2 col3
0    A    x    -
2    B    x    앞
4    B    y    뒤</code></pre>
<h2 id="차원축소-스칼라-변환-squeeze"><strong>차원축소, 스칼라 변환 (squeeze)</strong></h2>
<p><code>squeeze</code>메서드는 차원을 축소(압축)하는 메서드입니다. 예를들어 한개의 행이나 열만 있는 DataFrame을 <code>squeeze</code>하면 Series 객체가 되며, 1개 인덱스만 있는 Series를 <code>squeeze</code>하면 스칼라값이 됩니다. 마찬가지로 1행,1열만 있는 DataFrame 객체를 <code>squeeze</code>하면 스칼라 값이 됩니다.</p>
<p><code>axis</code> : 압축을 진행할 축 입니다.</p>
<pre><code class="language-python">df=pd.DataFrame(data=[[1,2],[3,4]],index=[&#39;row1&#39;,&#39;row2&#39;],columns=[&#39;col1&#39;,&#39;col2&#39;])
print(df)
&gt;&gt;
      col1  col2
row1     1     2
row2     3     4
</code></pre>
<p><strong>DataFrame을 Series로</strong></p>
<p>1개의 열이나 1개의 행만 있는 DataFrame객체를 <code>squeeze</code>하면 Series 객체가 됩니다.</p>
<p>먼저 <code>row1</code>을 <code>drop</code>하여 1행짜리 DataFrame을 만들고 <code>squeeze</code>하겠습니다.</p>
<pre><code class="language-python"># row1 삭제
df_row=df.drop(index=&#39;row1&#39;)
print(df_row)

      col1  col2
row2     3     4
</code></pre>
<pre><code class="language-python"># 압축 실행
print(df_row.squeeze())
#행을 축소한다
col1    3
col2    4
Name: row2, dtype: int64
</code></pre>
<p>결과값이 Series객체로 변환된 것을 확인할 수 있습니다.</p>
<p><code>col1</code>을 <code>drop</code>하여 1열짜리 DataFrame을 만들고 <code>squeeze</code>하겠습니다.</p>
<pre><code class="language-python"># col1 삭제
df_col=df.drop(columns=&#39;col1&#39;)
print(df_col)

      col2
row1     2
row2     4
</code></pre>
<pre><code class="language-python">print(df_row.squeeze())
#행을 축소
col1    3
col2    4
Name: row2, dtype: int64
</code></pre>
<p>결과값이 Series객체로 변환된 것을 확인할 수 있습니다.</p>
<p><strong>DataFrame을 스칼라 값으로 압축</strong></p>
<p><code>col1</code>과 <code>row1</code>을 삭제해서 요소1개짜리 DataFrame을 생성하고, <code>squeeze</code>를 실행하면 스칼라값이 반환됩니다.</p>
<pre><code class="language-python"># row1 , col1을 삭제하여 1행/1열짜리 DataFrame만들기
df_col_row = df.drop(index=&#39;row1&#39;,columns=&#39;col1&#39;)
print(df_col_row)

      col2
row2     4
</code></pre>
<pre><code class="language-python">print(df_col_row.squeeze())
&gt;&gt;
4
</code></pre>
<p>결과값으로 스칼라값이 반환된것을 확인할 수 있습니다.</p>
<p><strong>압축할 수 없는 경우</strong></p>
<p>압축할 수 없는경우 원본을 반환합니다.</p>
<pre><code class="language-python">print(df.squeeze())
&gt;&gt;
      col1  col2
row1     1     2
row2     3     4
</code></pre>
<h2 id="피벗변환-pivot"><strong>피벗변환 (pivot)</strong></h2>
<p><code>pivot</code>메서드는 데이터의 열을 기준으로 피벗테이블로 변환시키는 메서드 입니다.</p>
<p><code>index</code> : 인덱스로 사용될 열입니다.</p>
<p><code>columns</code> : 열로 사용될 열 입니다.</p>
<p><code>values</code> : 값으로 입력될 열 입니다.</p>
<p>※ <code>index</code>나 <code>columns</code>에 리스트를 입력 할 경우 멀티 인덱스로 피벗테이블이 생성됩니다.</p>
<p><code>values</code>에 리스트를 입력 할 경우 각 값에 대한 테이블이 연속적으로 생성됩니다.</p>
<pre><code class="language-python">col = [&#39;Machine&#39;,&#39;Country&#39;,&#39;Price&#39;,&#39;Brand&#39;]
data = [[&#39;TV&#39;,&#39;Korea&#39;,1000,&#39;A&#39;],
        [&#39;TV&#39;,&#39;Japan&#39;,1300,&#39;B&#39;],
        [&#39;TV&#39;,&#39;China&#39;,300,&#39;C&#39;],
        [&#39;PC&#39;,&#39;Korea&#39;,2000,&#39;A&#39;],
        [&#39;PC&#39;,&#39;Japan&#39;,3000,&#39;E&#39;],
        [&#39;PC&#39;,&#39;China&#39;,450,&#39;F&#39;]]
df = pd.DataFrame(data=data, columns=col)
print(df)

  Machine Country  Price Brand
0      TV   Korea   1000     A
1      TV   Japan   1300     B
2      TV   China    300     C
3      PC   Korea   2000     A
4      PC   Japan   3000     E
5      PC   China    450     F
</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p><code>index</code>를 Machine으로 <code>columns</code>를 Country로, <code>values</code>를 Price로 피벗 테이블을 생성해보겠습니다.</p>
<pre><code class="language-python">print(df.pivot(index=&#39;Machine&#39;,columns=&#39;Country&#39;,values=&#39;Price&#39;))

Country  China  Japan  Korea
Machine
PC         450   3000   2000
TV         300   1300   1000
</code></pre>
<p><code>values</code>값이 <code>list</code>형태일 경우 피벗테이블이 옆쪽으로 연속으로 생성됩니다.</p>
<pre><code class="language-python">print(df.pivot(index=&#39;Machine&#39;,columns=&#39;Country&#39;,values=[&#39;Price&#39;,&#39;Brand&#39;]))

        Price             Brand
Country China Japan Korea China Japan Korea
Machine
PC        450  3000  2000     F     E     A
TV        300  1300  1000     C     B     A
</code></pre>
<p>참고로, <code>values</code>를 따로 입력하지 않으면 남은 모든 열이 <code>values</code>에 입력되어 연속으로 출력됩니다.</p>
<pre><code class="language-python">print(df.pivot(index=&#39;Machine&#39;,columns=&#39;Country&#39;)

        Price             Brand
Country China Japan Korea China Japan Korea
Machine
PC        450  3000  2000     F     E     A
TV        300  1300  1000     C     B     A
</code></pre>
<p>그 상태에서 <code>[열 이름]</code> 형태를 붙여서 원하는 <code>values</code>만 출력할 수 있습니다.</p>
<pre><code class="language-python">print(df.pivot(index=&#39;Machine&#39;,columns=&#39;Country&#39;)[&#39;Brand&#39;])

Country China Japan Korea
Machine
PC          F     E     A
TV          C     B     A
</code></pre>
<p><strong>Multi index로 피벗 변환</strong></p>
<p><code>index</code>나 <code>columns</code>에 <code>list</code>형태의 데이터를 입력할 경우 멀티 인덱스 형식으로 피벗 테이블이 생성됩니다.</p>
<p><code>index</code>가 <code>list</code>형태일 경우</p>
<pre><code class="language-python">print(df.pivot(index=[&#39;Country&#39;,&#39;Machine&#39;],columns=&#39;Brand&#39;,values=&#39;Price&#39;))

Brand                 A       B      C       E      F
Country Machine
China   PC          NaN     NaN    NaN     NaN  450.0
        TV          NaN     NaN  300.0     NaN    NaN
Japan   PC          NaN     NaN    NaN  3000.0    NaN
        TV          NaN  1300.0    NaN     NaN    NaN
Korea   PC       2000.0     NaN    NaN     NaN    NaN
        TV       1000.0     NaN    NaN     NaN    NaN
</code></pre>
<p><code>columns</code>가 <code>list</code>형태일 경우</p>
<pre><code class="language-python">print(df.pivot(index=&#39;Country&#39;,columns=[&#39;Machine&#39;,&#39;Brand&#39;],values=&#39;Price&#39;))

Machine      TV                     PC
Brand         A       B      C       A       E      F
Country
China       NaN     NaN  300.0     NaN     NaN  450.0
Japan       NaN  1300.0    NaN     NaN  3000.0    NaN
Korea    1000.0     NaN    NaN  2000.0     NaN    NaN
</code></pre>
<p><strong>피벗변환이 불가한 경우</strong></p>
<p>중복값으로인해 피벗테이블의 생성이 불가능한 경우 오류를 반환합니다.</p>
<pre><code class="language-python"># 피벗화가 불가능한 중복값이 있는 객체 생성
df2 = pd.DataFrame(data=[[&#39;A&#39;,&#39;x&#39;,1],[&#39;A&#39;,&#39;x&#39;,2],[&#39;B&#39;,&#39;y&#39;,3],[&#39;B&#39;,&#39;z&#39;,4]],columns=[&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;])
print(df2
  col1 col2  col3
0    A    x     1
1    A    x     2
2    B    y     3
3    B    z     4
</code></pre>
<pre><code class="language-python"># 피벗생성 시 오류 발생
print(df2.pivot(index=&#39;col1&#39;,columns=&#39;col2&#39;,values=&#39;col3&#39;))
&gt;&gt;
오류발생
ValueError: Index contains duplicate entries, cannot reshape
</code></pre>
<h2 id="피벗생성_스프레드시트-기반-pivot_table"><strong>피벗생성_스프레드시트 기반 (pivot_table)</strong></h2>
<p><code>pivot_table</code>메서드는 데이터를 스프레드시트 기반 피벗 테이블로 변환하는 메서드입니다.</p>
<p>엑셀 스프레드시트 피벗 테이블과 유사한 기능을 합니다.</p>
<p><code>values</code> : 값으로 입력될 열 입니다.</p>
<p><code>index</code> : 인덱스로 사용될 열입니다.</p>
<p><code>columns</code> : 열로 사용될 열 입니다.</p>
<p><code>aggfunc</code> : 결과로 출력될 함수 입니다.</p>
<p><code>fill_value</code> : 결측치를 채워넣을 값입니다.</p>
<p><code>margins</code> : 합계를 표시할지 여부입니다. <code>True</code>일 경우 새 열을 생성하여 합계를 출력합니다.</p>
<p><code>dropna</code> : 항목이 모두 결측치인 열을 포함할지 여부입니다. 기본값은 <code>True</code>로 포함하지 않습니다.</p>
<p><code>margins_name</code> : <code>margins</code>가 <code>True</code>일 경우 해당 열의 이름입니다.</p>
<p><code>observed</code> : 범주형 그룹에 대해 관찰된 값만 표시할지 여부 입니다.</p>
<p><code>sort</code> : 각 범주들을 사전적으로 정리할지 여부입니다. 기본값은 <code>True</code>로 정렬이 수행됩니다.</p>
<pre><code class="language-jsx">col = [&#39;Machine&#39;,&#39;Country&#39;,&#39;Grade&#39;,&#39;Price&#39;,&#39;Count&#39;]
data = [[&#39;TV&#39;,&#39;Korea&#39;,&#39;A&#39;,1000,3],
        [&#39;TV&#39;,&#39;Korea&#39;,&#39;B&#39;, 800,8],
        [&#39;TV&#39;,&#39;Korea&#39;,&#39;B&#39;, 800,2],
        [&#39;TV&#39;,&#39;Japan&#39;,&#39;A&#39;,1300,5],
        [&#39;TV&#39;,&#39;Japan&#39;,&#39;A&#39;,1300,1],
        [&#39;PC&#39;,&#39;Korea&#39;,&#39;B&#39;,1500,6],
        [&#39;PC&#39;,&#39;Korea&#39;,&#39;A&#39;,2000,9],
        [&#39;PC&#39;,&#39;Japan&#39;,&#39;A&#39;,3000,3],
        [&#39;PC&#39;,&#39;Japan&#39;,&#39;B&#39;,2500,3]]
df = pd.DataFrame(data=data, columns=col)
print(df)

  Machine Country Grade  Price  Count
0      TV   Korea     A   1000      3
1      TV   Korea     B    800      8
2      TV   Korea     B    800      2
3      TV   Japan     A   1300      5
4      TV   Japan     A   1300      1
5      PC   Korea     B   1500      6
6      PC   Korea     A   2000      9
7      PC   Japan     A   3000      3
8      PC   Japan     B   2500      3</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p>index를 <code>Machine</code>, <code>Country</code>로 하고 columns를 <code>Grade</code>로 설정하고 <code>Count</code>값들을 <code>np.sum</code>으로 합계를 계산하여 스프레드 시트로 출력해보겠습니다.</p>
<pre><code class="language-python">print(df.pivot_table(values=&#39;Count&#39;,index=[&#39;Machine&#39;,&#39;Country&#39;],columns=&#39;Grade&#39;,aggfunc=np.sum))

# sum값으로 출력됨.
Grade              A     B
Machine Country
PC      Japan    3.0   3.0
        Korea    9.0   6.0
TV      Japan    6.0   NaN
        Korea    3.0  10.0</code></pre>
<p><strong>sort인수의 사용</strong></p>
<p>결과는 기본적으로 사전적으로 정렬이 되어있습니다. PC와 TV, Japan과 Korea는 알파벳순서로 정렬되어있습니다.</p>
<p><code>sort</code>를 <code>False</code>로하면 기존 입력 순서대로 출력이 됩니다.</p>
<pre><code class="language-python">print(df.pivot_table(values=&#39;Count&#39;,index=[&#39;Machine&#39;,&#39;Country&#39;],columns=&#39;Grade&#39;,aggfunc=np.sum,sort=False))

Grade              A     B
Machine Country
TV      Korea    3.0  10.0
        Japan    6.0   NaN
PC      Korea    9.0   6.0
        Japan    3.0   3.0
</code></pre>
<p><strong>여러 값에 대해 여러 함수 적용</strong></p>
<p>엑셀의 피벗테이블과 유사하게 여러 값에 대해서 여러 값(<code>values</code>)에 대해 여러 함수(<code>aggfunc</code>)를 설정할 수 있습니다.</p>
<pre><code class="language-python"># list를 이용하여 다중 함수 적용이 가능합니다.
print(df.pivot_table(values=[&#39;Count&#39;,&#39;Price&#39;],index=[&#39;Machine&#39;,&#39;Country&#39;],columns=&#39;Grade&#39;,aggfunc=[np.sum,np.mean]))

                  sum                        mean
                Count         Price         Count        Price
Grade               A     B       A       B     A    B       A       B
Machine Country
PC      Japan     3.0   3.0  3000.0  2500.0   3.0  3.0  3000.0  2500.0
        Korea     9.0   6.0  2000.0  1500.0   9.0  6.0  2000.0  1500.0
TV      Japan     6.0   NaN  2600.0     NaN   3.0  NaN  1300.0     NaN
        Korea     3.0  10.0  1000.0  1600.0   3.0  5.0  1000.0   800.0
</code></pre>
<p>dict를 이용할 경우 각 값에 대해서 특정 함수의 적용이 가능합니다.</p>
<pre><code class="language-python">print(df.pivot_table(values=[&#39;Count&#39;,&#39;Price&#39;],index=[&#39;Machine&#39;,&#39;Country&#39;],columns=&#39;Grade&#39;,aggfunc={&#39;Count&#39;:np.sum,&#39;Price&#39;:np.mean}))

                Count         Price
Grade               A     B       A       B
Machine Country
PC      Japan     3.0   3.0  3000.0  2500.0
        Korea     9.0   6.0  2000.0  1500.0
TV      Japan     6.0   NaN  1300.0     NaN
        Korea     3.0  10.0  1000.0   800.0
</code></pre>
<p><strong>fill_value를 이용한 결측치 제거</strong></p>
<p><code>fill_value</code>에 값을 입력하므로서 결측치를 해당 값으로 대체할 수 있습니다.</p>
<pre><code class="language-python">print(df.pivot_table(values=&#39;Count&#39;,index=[&#39;Machine&#39;,&#39;Country&#39;],columns=&#39;Grade&#39;,aggfunc=np.sum,fill_value=&#39;누락&#39;))

Grade              A     B
Machine Country
PC      Japan    3.0   3.0
        Korea    9.0   6.0
TV      Japan    6.0    누락
        Korea    3.0  10.0
</code></pre>
<p><strong>margines / margines_name 인수의 사용</strong></p>
<p><code>margines</code>를 이용해서 총계를 출력할 수 있으며 <code>margines_name</code>을 이용해서 해당 레이블의 이름을 지정할 수 있습니다.</p>
<pre><code class="language-python">print(df.pivot_table(values=&#39;Count&#39;,index=[&#39;Machine&#39;,&#39;Country&#39;],columns=&#39;Grade&#39;,aggfunc=np.sum,margins=True))

Grade               A     B  All
Machine Country
PC      Japan     3.0   3.0    6
        Korea     9.0   6.0   15
TV      Japan     6.0   NaN    6
        Korea     3.0  10.0   13
All              21.0  19.0   40
</code></pre>
<p><code>All</code>로 출력된 행/열의 이름을 변경해보겠습니다.</p>
<pre><code class="language-python">Copyprint(df.pivot_table(values=&#39;Count&#39;,index=[&#39;Machine&#39;,&#39;Country&#39;],columns=&#39;Grade&#39;,aggfunc=np.sum,margins=True,margins_name=&#39;총계&#39;))

Grade               A     B  총계
Machine Country
PC      Japan     3.0   3.0   6
        Korea     9.0   6.0  15
TV      Japan     6.0   NaN   6
        Korea     3.0  10.0  13
총계               21.0  19.0  40</code></pre>
<h2 id="피벗해제-melt"><strong>피벗해제 (melt)</strong></h2>
<p><code>melt</code> 메서드는 피벗 형태의 DataFrame을 기존 형태로 해체하는 메서드입니다.</p>
<p><code>id_vars</code> : 기준이 될 열 입니다.</p>
<p><code>value_vars</code> : 기준열에 대한 하위 카테고리를 나열할 열을 선택합니다.</p>
<p><code>var_name</code> : 카테고리들이 나열된 열의 이름을 설정합니다.</p>
<p><code>value_name</code> : 카테고리들의 값이 나열될 열의 이름을 설정합니다.</p>
<p><code>col_leve</code> : multi index의 경우 <code>melt</code>를 수행할 레벨을 설정합니다.</p>
<p><code>ignore_index</code> : 인덱스를 1,2,3, ... , n으로 설정할지 여부입니다. 기본적으로 <code>True</code>로 1,2,3, ... , n으로 설정됩니다.</p>
<pre><code class="language-python">col = [&#39;Country&#39;,&#39;Machine&#39;,&#39;Price&#39;,&#39;Brand&#39;]
data = [[&#39;Korea&#39;,&#39;TV&#39;,1000,&#39;A&#39;],
        [&#39;Japan&#39;,&#39;TV&#39;,1300,&#39;B&#39;],
        [&#39;Korea&#39;,&#39;PC&#39;,2000,&#39;A&#39;],
        [&#39;Japan&#39;,&#39;PC&#39;,3000,&#39;E&#39;]]
df = pd.DataFrame(data=data, columns=col)
print(df)

  Country Machine  Price Brand
0   Korea      TV   1000     A
1   Japan      TV   1300     B
2   Korea      PC   2000     A
3   Japan      PC   3000     E
</code></pre>
<hr>
<p><code>Country</code>를 기준으로하여 <code>Machine</code>과 <code>Price</code>의 값을 하위 카데고리로 <code>melt</code>를 수행해보겠습니다.</p>
<pre><code class="language-python">print(df.melt(id_vars=&#39;Country&#39;,value_vars=[&#39;Machine&#39;,&#39;Price&#39;]))

  Country variable value
0   Korea  Machine    TV
1   Japan  Machine    TV
2   Korea  Machine    PC
3   Japan  Machine    PC
4   Korea    Price  1000
5   Japan    Price  1300
6   Korea    Price  2000
7   Japan    Price  3000
</code></pre>
<p><code>ignore_index</code>를 False로 할 경우 기존 인덱스를 사용하게 됩니다.</p>
<pre><code class="language-python">print(df.melt(id_vars=&#39;Country&#39;,value_vars=[&#39;Machine&#39;,&#39;Price&#39;],ignore_index=False))

# 기존 인덱스를 사용한 것을 확인 할 수 있습니다.
  Country variable value
0   Korea  Machine    TV
1   Japan  Machine    TV
2   Korea  Machine    PC
3   Japan  Machine    PC
0   Korea    Price  1000
1   Japan    Price  1300
2   Korea    Price  2000
3   Japan    Price  3000
</code></pre>
<p><code>var_name</code>과 <code>value_name</code>을 지정함으로써 열 이름의 기본값인 <code>variable</code>과 <code>value</code>를 원하는 값으로 변경할 수 있습니다.</p>
<pre><code class="language-python">print(df.melt(id_vars=&#39;Country&#39;,value_vars=[&#39;Machine&#39;,&#39;Price&#39;],var_name=&#39;Category&#39;,value_name=&#39;val&#39;))

  Country Category   val
0   Korea  Machine    TV
1   Japan  Machine    TV
2   Korea  Machine    PC
3   Japan  Machine    PC
4   Korea    Price  1000
5   Japan    Price  1300
6   Korea    Price  2000
7   Japan    Price  3000
</code></pre>
<p><strong>Multi-Index의 경우</strong></p>
<p>Multi-Index(Multi-Columns)의 경우에는 인수들을 리스트-튜플로 설정하거나 <code>col_level</code>을 지정해줌으로써 원하는대로 출력이 가능합니다.</p>
<p>먼저 기존의 <code>Country</code>열을 좀더 세분화하여 <code>Country-City</code>로 Multi-Columns을 생성해보겠습니다.</p>
<pre><code class="language-python">col2 = [[&#39;Area&#39;,&#39;Area&#39;,&#39;Value&#39;,&#39;Value&#39;,&#39;Value&#39;],[&#39;Country&#39;,&#39;City&#39;,&#39;Machine&#39;,&#39;Price&#39;,&#39;Brand&#39;]]
data2 =[[&#39;Korea&#39;,&#39;Seoul&#39;,&#39;TV&#39;,1000,&#39;A&#39;],
        [&#39;Japan&#39;,&#39;Tokyo&#39;,&#39;TV&#39;,1300,&#39;B&#39;],
        [&#39;Korea&#39;,&#39;Jeju&#39;,&#39;PC&#39;,2000,&#39;A&#39;],
        [&#39;Japan&#39;,&#39;Kyoto&#39;,&#39;PC&#39;,3000,&#39;E&#39;]]
df2=pd.DataFrame(data=data2, columns=col2)
print(df2)

     Area          Value
  Country   City Machine Price Brand
0   Korea  Seoul      TV  1000     A
1   Japan  Tokyo      TV  1300     B
2   Korea   Jeju      PC  2000     A
3   Japan  Kyoto      PC  3000     E
</code></pre>
<p>이제 <code>City</code>에대해서 <code>Price</code>만 출력해보겠습니다.</p>
<p>하위 레벨에대해 출력할 경우 튜플을 이용해서 (&#39;Area&#39;,&#39;City&#39;)로, (&#39;Value&#39;,&#39;Price&#39;)로 세부설정을 입력하여 출력할 수 있습니다.</p>
<pre><code class="language-python">print(df2.melt(id_vars=[(&#39;Area&#39;,&#39;City&#39;)],value_vars=[(&#39;Value&#39;,&#39;Price&#39;)])
  (Area, City) variable_0 variable_1  value
0        Seoul      Value      Price   1000
1        Tokyo      Value      Price   1300
2         Jeju      Value      Price   2000
3        Kyoto      Value      Price   3000
</code></pre>
<p><code>col_level</code>을 설정해 줄 경우 보다 간단하게 하위 카테고리의 출력이 가능합니다.</p>
<pre><code class="language-python">print(df2.melt(id_vars=&#39;City&#39;,value_vars=&#39;Price&#39;,col_level=1))
&gt;&gt;
    City variable  value
0  Seoul    Price   1000
1  Tokyo    Price   1300
2   Jeju    Price   2000
3  Kyoto    Price   3000
</code></pre>
<h2 id="새-열-할당-assign"><strong>새 열 할당 (assign)</strong></h2>
<p><code>assign</code>메서드는 DataFrame에 새 열을 할당하는 메서드입니다.</p>
<p>할당할 새 열이 기존열과 이름이 같을경우 덮어씌워집니다.</p>
<p><code>kwargs</code> : <code>새열이름 = 내용</code> 형식으로 입력되는 키워드입니다. 콤마(<code>,</code>)를 통해 여러개를 입력할 수 있습니다.</p>
<pre><code class="language-python">df = pd.DataFrame(index=[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;],data={&#39;col1&#39;:[1,2,3]})
print(df)
&gt;&gt;
      col1
row1     1
row2     2
row3     3
</code></pre>
<hr>
<p><code>lambda</code>를 이용해 <code>col1</code>에 <code>+2</code>를 한 값으로 <code>col2</code>를 생성해보겠습니다.</p>
<pre><code class="language-python">print(df.assign(col2=lambda x : x.col1+2))
&gt;&gt;
      col1  col2
row1     1     3
row2     2     4
row3     3     5
</code></pre>
<p><code>lambda</code>를 사용하지 않고 아래와같이 새 열을 추가할 수 있습니다.</p>
<pre><code class="language-python">print(df.assign(col3=df[&#39;col1&#39;]*(-2)))
&gt;&gt;
      col1  col3
row1     1    -2
row2     2    -4
row3     3    -6
</code></pre>
<p><strong>동시에 여러열 할당</strong></p>
<p>쉼표로 구분을 지으면서 여러개의 열을 할당할 수 있습니다.</p>
<pre><code class="language-python">print(df.assign(col2=lambda x : x.col1+2,col3=df[&#39;col1&#39;]*(-2)))
&gt;&gt;
      col1  col2  col3
row1     1     3    -2
row2     2     4    -4
row3     3     5    -6
</code></pre>
<p><strong>열이 중복될 경우</strong></p>
<p>만약 추가할 새 열의 이름이 기존열과 중복된다면, 새 값으로 덮어씌워집니다.</p>
<pre><code class="language-python">print(df.assign(col1=[0,0,0]))
&gt;&gt;
      col1
row1     0
row2     0
row3     0
</code></pre>
<h2 id="값-변경-replace"><strong>값 변경 (replace)</strong></h2>
<p><code>replace</code>메서드는 객체 내 값을 다른 값으로 변경하는 메서드입니다.</p>
<p><code>to_replace</code> : 변경전 기존 값입니다.</p>
<p><code>value</code> : 변경될 값입니다.</p>
<p><code>inplace</code> : 원본을 변경할지 여부입니다.</p>
<p><code>limit</code> : <code>method</code> 사용시 변경 될 갯수 입니다.</p>
<p><code>regex</code> : regex 문법을 이용하여 변경값을 정합니다.</p>
<pre><code class="language-python">df = pd.DataFrame([[1,2,3], [4,5,6], [7,8,9]], index=[&#39;row1&#39;, &#39;row2&#39;, &#39;row3&#39;], columns=[&#39;col1&#39;, &#39;col2&#39;, &#39;col3&#39;])
print(df)
&gt;&gt;
     col1 col2 col3
row1   1    2    3
row2   4    5    6
row3   7    8    9
</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p>객체 전체에서 1을 99로 변경해보겠습니다.</p>
<pre><code class="language-python">print(df.replace(to_replace=1,value=99))
&gt;&gt;
     col1 col2  col3   col4
row1    A    w    99  alpha
row2    B    x     2   beta
row3    C    y     3  gamma
row4    D    z     4  delta
</code></pre>
<p><code>to_replace</code>값이 <code>list</code>형태이고 <code>value</code>값이 단일값이면 전체가 동일하게 변경됩니다.</p>
<p><code>A</code>, <code>B</code>, <code>y</code>, <code>z</code>를 <code>-</code>로 변경해보겠습니다.</p>
<pre><code class="language-python">print(df.replace(to_replace=[&#39;A&#39;,&#39;B&#39;,&#39;y&#39;,&#39;z&#39;],value=&#39;-&#39;))
&gt;&gt;
     col1 col2  col3   col4
row1    -    w     1  alpha
row2    -    x     2   beta
row3    C    -     3  gamma
row4    D    -     4  delta
</code></pre>
<p><code>to_replace</code>값과 <code>value</code>값이 모두 같은 길이의 <code>list</code>형태일 경우 각각 같은 순서의 값으로 변경됩니다.</p>
<p><code>A</code>, <code>B</code>, <code>y</code>, <code>z</code>를 각각 <code>a</code>, <code>b</code>, <code>Y</code>, <code>Z</code>로 변경해보겠습니다.</p>
<pre><code class="language-python">print(df.replace(to_replace=[&#39;A&#39;,&#39;B&#39;,&#39;y&#39;,&#39;z&#39;],value=[&#39;a&#39;,&#39;b&#39;,&#39;Y&#39;,&#39;Z&#39;]))
&gt;&gt;
     col1 col2  col3   col4
row1    a    w     1  alpha
row2    b    x     2   beta
row3    C    Y     3  gamma
row4    D    Z     4  delta
</code></pre>
<p><strong>method와 limit인수의 사용</strong></p>
<p><code>method</code>가 <code>ffill</code>일 경우 <code>to_replace</code>값을 바로 위 값으로 변경하며, <code>bfill</code>일 경우 <code>to_replace</code>값을 바로 아래 값으로 변경합니다.</p>
<p><code>method</code>가 <code>ffill</code>인 경우</p>
<pre><code class="language-python">print(df.replace(to_replace=[&#39;x&#39;,&#39;y&#39;],method=&#39;ffill&#39;))
&gt;&gt;
     col1 col2  col3   col4   # x와 y를 바로 위의 값인 w로 변경
row1    A    w     1  alpha
row2    B    w     2   beta
row3    C    w     3  gamma
row4    D    z     4  delta
</code></pre>
<p><code>method</code>가 <code>bfill</code>인 경우</p>
<pre><code class="language-python">print(df.replace(to_replace=[&#39;x&#39;,&#39;y&#39;],method=&#39;bfill&#39;))
&gt;&gt;
     col1 col2  col3   col4  # x와 y를 바로 아래의 값인 z로 변경
row1    A    w     1  alpha
row2    B    z     2   beta
row3    C    z     3  gamma
row4    D    z     4  delta
</code></pre>
<p><code>method</code>인수를 사용할때 <code>limit</code>인수를 통해 변경될 갯수를 지정할 수 있습니다. <code>limit=1</code>을 통해 1개만 변경해보겠습니다.</p>
<pre><code class="language-python">print(df.replace(to_replace=[&#39;x&#39;,&#39;y&#39;],method=&#39;bfill&#39;,limit=1))
&gt;&gt;
     col1 col2  col3   col4   # x와 y에 대하여 bfill을 통해 아랫값인 z로 변경했으나 limit=1로 1개만 변경
row1    A    w     1  alpha
row2    B    x     2   beta
row3    C    z     3  gamma
row4    D    z     4  delta
</code></pre>
<p><strong>dict형식의 사용</strong></p>
<p><code>to_replace</code>에 <code>dict</code>형태를 입력하여 <code>value</code>값 설정 없이 변경이 가능합니다.</p>
<p><code>A</code>를 <code>a</code>로, <code>z</code>를 <code>Z</code>로 변경해보겠습니다.</p>
<pre><code class="language-python">print(df.replace(to_replace={&#39;A&#39;:&#39;a&#39;,&#39;z&#39;:&#39;Z&#39;}))
&gt;&gt;
     col1 col2  col3   col4
row1    a    w     1  alpha
row2    B    x     2   beta
row3    C    y     3  gamma
row4    D    Z     4  delta
</code></pre>
<p><code>dict</code>안에 <code>dict</code>를 넣음으로써 특정 열의 특정값을 원하는 값으로 변경 할 수 있습니다.</p>
<p><code>col3</code>을 대상으로 <code>1</code>을 <code>-</code>로, <code>4</code>를 <code>+</code>로 변경해보겠습니다.</p>
<pre><code class="language-python">print(df.replace(to_replace={&#39;col3&#39;:{1:&#39;-&#39;,4:&#39;+&#39;}}))
&gt;&gt;
     col1 col2 col3   col4
row1    A    w    -  alpha
row2    B    x    2   beta
row3    C    y    3  gamma
row4    D    z    +  delta
</code></pre>
<p><code>dict</code>를 통해 각 열의 변경 원하는 값을 지정 후 <code>value</code>를 통해 변경이 가능합니다.</p>
<p><code>col1</code>열에서 <code>B</code>를, <code>col2</code>열에서 <code>w</code>를 <code>100</code>으로 변경해보겠습니다.</p>
<pre><code class="language-python">print(df.replace(to_replace={&#39;col1&#39;:&#39;B&#39;,&#39;col2&#39;:&#39;w&#39;},value=100))
&gt;&gt;
     col1 col2  col3   col4
row1    A  100     1  alpha
row2  100    x     2   beta
row3    C    y     3  gamma
row4    D    z     4  delta
</code></pre>
<p><strong>regex의 사용</strong></p>
<p><code>regex</code>를 사용할 경우 정규표현식으로 원하는 값을 지정해서 변경 할 수 있습니다.</p>
<p><code>to_replace</code>를 <code>r&#39;[e]&#39;로 지정하고</code>value<code>를</code>-<code>로 하여 문자열에</code>e<code>가 포함될 경우</code>-<code>로 바꿔보겠습니다.</code></p>
<p>※이때 <code>regex=True</code>로 해서 활성화를 진행해주어야 합니다.</p>
<pre><code class="language-python">print(df.replace(to_replace=r&#39;[e]&#39;,value=&#39;-&#39;,regex=True))
&gt;&gt;
     col1 col2  col3   col4
row1    A    w     1  alpha
row2    B    x     2   b-ta
row3    C    y     3  gamma
row4    D    z     4  d-lta
</code></pre>
<p><code>to_replace</code>를 사용하지 않고 단순히 <code>regex</code>에 정규표현식을 입력하여도 동일한 결과를 얻을 수 있습니다.</p>
<pre><code class="language-python">print(df.replace(regex=r&#39;[e]&#39;, value=&#39;-&#39;))
&gt;&gt;
     col1 col2  col3   col4
row1    A    w     1  alpha
row2    B    x     2   b-ta
row3    C    y     3  gamma
row4    D    z     4  d-lta
</code></pre>
<p><strong>inplace를 통한 원본의 변경</strong></p>
<p>Pandas 공통사항으로 <code>inplcace=True</code>일 경우 원본을 변경하게 됩니다.</p>
<pre><code class="language-python">df.replace(regex=r&#39;[e]&#39;, value=&#39;-&#39;,inplace=True)
print(df)
&gt;&gt;
     col1 col2  col3   col4   # df를 출력함으로서 원본이 변경된것을 확인.
row1    A    w     1  alpha
row2    B    x     2   b-ta
row3    C    y     3  gamma
row4    D    z     4  d-lta
</code></pre>
<h1 id="리스트-형태의-값-전개-explode"><strong>리스트 형태의 값 전개 (explode)</strong></h1>
<p><code>explode</code> 메서드는 리스트형태의 값을 여러 행으로 전개하는 메서드 입니다.</p>
<p><code>column</code> : 전개할 리스트형태의 데이터가 있는 열 입니다.</p>
<p><code>ignore_index</code> : True일 경우 기존 인덱스를 무시하고 0,1,2, ... , n 형태의 인덱스로 변환됩니다.</p>
<pre><code class="language-python">data= [[[1,2,3],0,[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;]],[4,[],3],[5,2,[&#39;x&#39;,&#39;y&#39;,&#39;z&#39;]]]
idx = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
df = pd.DataFrame(data = data, index = idx, columns = col)
print(df)
&gt;&gt;
           col1 col2       col3
row1  [1, 2, 3]    0  [a, b, c]
row2          4   []          3
row3          5    2  [x, y, z]
</code></pre>
<h2 id=""></h2>
<p><strong>기본적인 사용법</strong></p>
<p>리스트형태의 데이터가 있는 열을 지정함으로써 해당 리스트를 여러행으로 전개할 수 있습니다.</p>
<p><code>col1</code>열을 전개해보겠습니다.</p>
<pre><code class="language-python">print(df.explode(&#39;col1&#39;))
&gt;&gt;
     col1 col2       col3
row1    1    0  [a, b, c] # row1, col1의 [1,2,3]이 전개된 것을 확인할 수 있습니다.&lt;br&gt;
row1    2    0  [a, b, c]
row1    3    0  [a, b, c]
row2    4   []          3
row3    5    2  [x, y, z]
</code></pre>
<p>빈 리스트의 경우 <code>NaN</code>이 반환됩니다.</p>
<pre><code class="language-python">print(df.explode(&#39;col2&#39;))
&gt;&gt;
           col1 col2       col3
row1  [1, 2, 3]    0  [a, b, c]
row2          4  NaN          3 # 빈 리스트가 NaN으로 전개된것을 확인할 수 있습니다.&lt;br&gt;
row3          5    2  [x, y, z]
</code></pre>
<p>행에 여러개의 리스트 형태의 데이터가 있을 경우 모두 전개합니다.</p>
<pre><code class="language-python">print(df.explode(&#39;col3&#39;))
&gt;&gt;
           col1 col2 col3
row1  [1, 2, 3]    0    a
row1  [1, 2, 3]    0    b
row1  [1, 2, 3]    0    c
row2          4   []    3
row3          5    2    x
row3          5    2    y
row3          5    2    z
</code></pre>
<p><strong>여러 열을 동시에 전개할 경우</strong></p>
<p>여러 열을 동시에 전개하려면 해당 열의 같은 행에 있는 리스트 형태의 데이터가 같은 길이를 가져야 합니다.</p>
<p>먼저, 해당 예시를 만족하는 데이터를 만들어 보겠습니다.</p>
<pre><code class="language-python">data = [[[1,2],[&#39;a&#39;,&#39;b&#39;]],[3,&#39;c&#39;]]
idx = [&#39;row1&#39;,&#39;row2&#39;]
col = [&#39;col1&#39;,&#39;col2&#39;]
df = pd.DataFrame(data =data, index = idx, columns = col)
print(df)
&gt;&gt;
        col1    col2
row1  [1, 2]  [a, b]
row2       3       c
</code></pre>
<p><code>row1</code>에 같은 길이를 갖는 리스트 형태의 데이터가 있습니다.</p>
<pre><code class="language-python">print(df.explode(column=[&#39;col1&#39;,&#39;col2&#39;]))
&gt;&gt;
     col1 col2
row1    1    a
row1    2    b
row2    3    c
</code></pre>
<p><strong>ignore_index인수의 사용</strong></p>
<p><code>ignore_index=True</code>인 경우 기존 인덱스는 무시되고 0, 1, 2, ... , n 형태의 인덱스로 변경됩니다.</p>
<pre><code class="language-python">print(df.explode(column=[&#39;col1&#39;,&#39;col2&#39;],ignore_index=True))
&gt;&gt;
  col1 col2
0    1    a
1    2    b
2    3    c</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-04-11]]></title>
            <link>https://velog.io/@smile_07/2025-04-11</link>
            <guid>https://velog.io/@smile_07/2025-04-11</guid>
            <pubDate>Fri, 11 Apr 2025 10:32:58 GMT</pubDate>
            <description><![CDATA[<h2 id="값-기준-정렬-sort_values"><strong>값 기준 정렬 (sort_values)</strong></h2>
<p><code>sort_values</code> 메서드는 값을 기준으로 레이블을 정렬하는 메서드입니다.</p>
<p><code>by</code> : 정렬 기준이될 레이블입니다.
<code>axis</code> : {0 : index / 1: columns} 정렬할 레이블입니다. 0이면 행, 1이면 열을 기준으로 정렬합니다.
<code>inplace</code> : 원본을 대체할지 여부입니다. <code>True</code>일 경우 원본을 대체하게 됩니다.
<code>kind</code> : 알고리즘 모드 입니다. 모드는 총 4종으로 <code>quicksort</code>, <code>mergesort</code>,
<code>heapsort</code>, <code>stable</code>이 있는데,
속도와 효율성의 차이를 갖습니다. 기본적으로 <code>quicksort</code>이며, 자세한건 numpy doc에서 확인 가능합니다.
<code>na_position</code> : {first / last} <code>Na</code>값의 위치입니다. 기본값은 <code>last</code>로 정렬시 맨 뒤에 위치합니다.
<code>ignore_index</code> : 인덱스의 무시 여부입니다. <code>True</code>일 경우 인덱스의 순서와 상관없이 0,1,2,... 로 정해집니다.
<code>key</code> : 이 인수를 통해 정렬방식으로 함수를 사용할 수 있습니다. <code>lamba</code>의 사용이 가능합니다.</p>
<p>먼저 <code>np.NaN</code>이 포함된 간단한 5x3짜리 데이터를 만들어보겠습니다.</p>
<pre><code class="language-python">na = np.NaN
data = [[-3,&#39;A&#39;,17],
        [na,&#39;D&#39;,31],
        [ 7,&#39;D&#39;,-8],
        [15,&#39;Z&#39;, 3],
        [ 0, na,-7]]
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
row = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;,&#39;row5&#39;]
df = pd.DataFrame(data = data, index = row, columns= col)
print(df)

&gt;&gt;
      col1 col2  col3
row1  -3.0    A    17
row2   NaN    D    31
row3   7.0    D    -8
row4  15.0    Z     3
row5   0.0  NaN    -7</code></pre>
<p>정렬의 기준이 되는 <code>by</code>에는 레이블명이 되는 <code>str</code>이 올수도 있고, 레이블명들의 <code>list</code>가 올 수 있습니다.
<code>list</code>형태가 올 경우, 첫 값부터 정렬합니다.</p>
<pre><code class="language-python">print(df.sort_values(by=&#39;col3&#39;))
#col3을 기준으로 오름차순 정렬된 것을 확인할 수 있습니다.
      col1 col2  col3
row3   7.0    D    -8
row5   0.0  NaN    -7
row4  15.0    Z     3
row1  -3.0    A    17
row2   NaN    D    31</code></pre>
<pre><code class="language-python">print(df.sort_values(by=[&#39;col2&#39;,&#39;col3&#39;]))
 # col2 기준으로 정렬 후 같은값인 &#39;D&#39;에 대해서는
 # col3 기준으로 정렬된 것을 확인 할 수 있습니다 
      col1 col2  col3
row1  -3.0    A    17
row3   7.0    D    -8
row2   NaN    D    31
row4  15.0    Z     3
row5   0.0  NaN    -7</code></pre>
<p><strong>axis인수의 사용</strong></p>
<p><code>axis</code>인수를 사용하여 어떤축을 기준으로 정렬할지 설정이 가능합니다.
단, 문자와 숫자의 혼용시 오류가 발생합니다. ※ Na는 무시됩니다.
열 기준 <code>col3</code>으로 오름차순 정렬</p>
<pre><code class="language-python">print(df.sort_values(by=&#39;col3&#39;,axis=0))

      col1 col2  col3
row3   7.0    D    -8
row5   0.0  NaN    -7
row4  15.0    Z     3
row1  -3.0    A    17
row2   NaN    D    31</code></pre>
<p>행 기준 <code>row1</code>의 오름차순 정렬. 문자와 숫자의 혼용으로 오류가 발생합니다.</p>
<pre><code class="language-python">print(df.sort_values(by=&#39;row1&#39;,axis=1))
&gt;&gt;
오류 발생</code></pre>
<p>행 기준 <code>row5</code>의 오름차순 정렬. 문자와 <code>NaN</code>의 혼용이기 때문에 정상적으로 정렬 됩니다.</p>
<pre><code class="language-python">print(df.sort_values(by=&#39;row5&#39;,axis=1))
      col3  col1 col2
row1    17  -3.0    A
row2    31   NaN    D
row3    -8   7.0    D
row4     3  15.0    Z
row5    -7   0.0  NaN</code></pre>
<p><strong>ascending인수의 사용</strong></p>
<p><code>ascending</code>인수를 이용하여 오름차순과 내림차순을 설정할 수 있습니다.
기본값은 <code>True</code>로 오름차순입니다. 내림차순의 경우 <code>False</code>로 아래와 같습니다.</p>
<pre><code class="language-python">print(df.sort_values(by=&#39;col3&#39;,ascending=False))

      col1 col2  col3  
# col3 기준으로 내림차순정렬이 된 것을 알 수 있습니다.
row2   NaN    D    31
row1  -3.0    A    17
row4  15.0    Z     3
row5   0.0  NaN    -7
row3   7.0    D    -8</code></pre>
<p><strong>na_position인수의 사용</strong></p>
<p><code>na_position</code>인수를 이용하여 결측값의 위치를 지정할 수 있습니다.
결측값이 맨 뒤(기본값)</p>
<pre><code class="language-python">print(df.sort_values(by=&#39;col1&#39;,na_position=&#39;last&#39;))

      col1 col2  col3
row1  -3.0    A    17
row5   0.0  NaN    -7
row3   7.0    D    -8
row4  15.0    Z     3
row2   NaN    D    31</code></pre>
<p>결측값이 맨 앞</p>
<pre><code class="language-python">print(df.sort_values(by=&#39;col1&#39;,na_position=&#39;first&#39;))

      col1 col2  col3
row2   NaN    D    31
row1  -3.0    A    17
row5   0.0  NaN    -7
row3   7.0    D    -8
row4  15.0    Z     3</code></pre>
<p><strong>ignore_index인수의 사용</strong></p>
<p><code>ignore_index</code>인수를 사용하여 인덱스를 미사용 할 수 있습니다. 어떤식으로 정렬 되더라도
인덱스는 0, 1, 2, 3, ... 순서로 표시됩니다.</p>
<pre><code class="language-python">print(df.sort_values(by=&#39;col3&#39;,ignore_index=True))

   col1 col2  col3
0   7.0    D    -8
1   0.0  NaN    -7
2  15.0    Z     3
3  -3.0    A    17
4   NaN    D    31
</code></pre>
<p><strong>key인수의 사용</strong></p>
<p><code>key</code>인수를 사용하여 정렬에 함수를 이용할 수 있습니다</p>
<pre><code class="language-python">print(df.sort_values(by=&#39;col2&#39;,key=lambda col: col.str.lower()))

      col1 col2  col3
row1  -3.0    A    17
row2   NaN    D    31
row3   7.0    D    -8
row4  15.0    Z     3
row5   0.0  NaN    -7
</code></pre>
<p><strong>inplcae 인수의 사용</strong></p>
<p><code>inplace</code> 인수를 사용해서 원본을 대체할지의 여부를 설정할 수 있습니다.</p>
<pre><code class="language-python">df.sort_values(by=&#39;col3&#39;,inplace=True)
print(df) #그냥 df를 출력함으로써 원본의 대체 여부가 확인 가능합니다.

      col1 col2  col3
row3   7.0    D    -8
row5   0.0  NaN    -7
row4  15.0    Z     3
row1  -3.0    A    17
row2   NaN    D    31</code></pre>
<h2 id="인덱스-기준-정렬-sort_index"><strong>인덱스 기준 정렬 (sort_index)</strong></h2>
<p><code>axis</code> : {0 : index / 1: columns} 정렬할 레이블입니다. 0이면 행, 1이면 열을 기준으로 정렬합니다.
<code>level</code> : multi index의 경우 정렬을 진행할 level입니다.
<code>ascending</code> : 오름차순으로할지 여부 입니다. 기본은 <code>True</code>로 오름차순입니다.
<code>inplace</code> : 원본을 대체할지 여부입니다. <code>True</code>일 경우 원본을 대체하게 됩니다.
<code>kind</code> : 알고리즘 모드 입니다. 모드는 총 4종으로 <code>quicksort</code>, <code>mergesort</code>,<code>heapsort</code>, <code>stable</code>이 있는데,
속도와 효율성의 차이를 갖습니다. 기본적으로 <code>quicksort</code>이며, 자세한건 numpy doc에서 확인 가능합니다.</p>
<p><code>na_position</code> : {first / last} <code>Na</code>값의 위치입니다. 기본값은 <code>last</code>로 정렬시 맨 뒤에 위치합니다.
<code>sort_remaining</code> : multi index의 경우 다른 레벨에 대해서도 정렬을할지 여부입니다. <code>True</code>로 할 경우
한 레벨에 대한 정렬이 완료되면, 다른 레벨도 정렬합니다.
<code>ignore_index</code> : 인덱스의 무시 여부입니다. <code>True</code>일 경우 인덱스의 순서와 상관없이 0,1,2,... 로 정해집니다.</p>
<p><strong>level의 지정</strong>
<code>level</code>을 지정하므로써 해당 level에서의 정렬이 가능합니다.
<code>level</code>이 0인 경우 <code>row</code>기준으로 정렬되는것을 확인 할 수 있습니다.</p>
<pre><code class="language-python">print(df.sort_index(axis=0, level=0))

           col4  col1  col2
row1 val1   1.0   2.0     3
     val2   4.0   NaN     6
row2 val2  19.0  20.0    21
     val5  16.0  17.0    18
row3 val1   NaN  11.0    12
     val2  13.0  14.0    15
     val3   7.0   8.0     9</code></pre>
<p><code>level</code>이 1인 경우 <code>val</code>기준으로 정렬되는것을 확인 할 수 있습니다.</p>
<pre><code class="language-python">print(df.sort_index(axis=0, level=1))

           col4  col1  col2
row1 val1   1.0   2.0     3
row3 val1   NaN  11.0    12
row1 val2   4.0   NaN     6
row2 val2  19.0  20.0    21
row3 val2  13.0  14.0    15
     val3   7.0   8.0     9
row2 val5  16.0  17.0    18</code></pre>
<p><strong>level별 ascending의 병용</strong></p>
<p><code>level</code>과 <code>ascending</code>의 값을 <code>list</code>형태로 입력하므로써, 각 level에 다른 정렬방식의 사용이 가능합니다.
<code>level</code>이 1인 <code>val</code>이 내림차순 정렬되고, <code>level</code>이 0인 <code>row</code>가 오름차순 정렬된것을 확인 할 수 있습니다.</p>
<pre><code class="language-python">print(df.sort_index(axis=0, level=[1,0],ascending=[False,True]))

           col4  col1  col2
row2 val5  16.0  17.0    18
row3 val3   7.0   8.0     9
row1 val2   4.0   NaN     6
row2 val2  19.0  20.0    21
row3 val2  13.0  14.0    15
row1 val1   1.0   2.0     3
row3 val1   NaN  11.0    12</code></pre>
<p><strong>sort_remaining 인수의 사용</strong></p>
<p>multi index에서 <code>sort_remaining</code>인수를 <code>True</code>로 할 경우 level별로 순차적으로 정렬이 진행됩니다.
만약 <code>level</code>을 따로 지정했다면, 해당 level부터 정렬한 후 나머지 level을 순차적으로 정렬합니다.
<code>row</code>정렬 후 <code>val</code>의 정렬까지 완료된 것을 확인할 수 있습니다.</p>
<pre><code class="language-python">print(df.sort_index(axis=0, sort_remaining=True))#기본적으로 sort_remaining은 True가 기본값이다

           col4  col1  col2
row1 val1   1.0   2.0     3
     val2   4.0   NaN     6
row2 val2  19.0  20.0    21
     val5  16.0  17.0    18
row3 val1   NaN  11.0    12
     val2  13.0  14.0    15
     val3   7.0   8.0     9</code></pre>
<h2 id="정렬후-추출-nlargest-nsmallest"><strong>정렬후 추출 (nlargest, nsmallest)</strong></h2>
<p><code>nlargest</code>메서드와 <code>nsmallest</code>메서드는 데이터를 오름차순/내림차순 정렬 후, 위에서 <code>n</code>개의 행을 출력하는 메서들입니다.
사실상 <code>df.sort_values(columns, ascending=True/False).head(n)</code>와 사용방식이 완전히 동일합니다.</p>
<p><code>n</code> : 정렬 후 출력할 행의 수 입니다.</p>
<p><code>columns</code> : 정렬의 기준이 될 열 입니다.</p>
<p><code>keep</code> :{first, last, all} 동일한 값일경우 어느 행을 출력할지 정합니다. <code>first</code>면 위부터, <code>last</code>면 아래부터, <code>all</code>이면 모두 출력합니다.</p>
<pre><code class="language-python">col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
row = [&#39;row3&#39;,&#39;row5&#39;,&#39;row1&#39;,&#39;row4&#39;,&#39;row2&#39;]
data = [[ 1, 21, 7],
        [ 2, 33, 3],
        [ 2,  7,97],
        [ 4, 56,31],
        [ 5, 18, 5]]
df = pd.DataFrame(data=data, index=row, columns=col)
print(df)
&gt;&gt;
      col1  col2  col3
row3     1    21     7
row5     2    33     3
row1     2     7    97
row4     4    56    31
row2     5    18     5</code></pre>
<p><strong>keep 인수의 사용</strong></p>
<p><code>keep</code>인수를 통해 중복일경우의 출력할 행을 지정할 수 있습니다.
처음 발생한 값부터 출력(위쪽값 출력)</p>
<pre><code class="language-python">print(df.nlargest(n=3, columns=&#39;col1&#39;,keep=&#39;first&#39;))
#중복된 값은 첫번째 부터 출력한다
           col4  col1  col2
row2 val2  19.0  20.0    21
     val5  16.0  17.0    18
row3 val2  13.0  14.0    15</code></pre>
<pre><code class="language-python">print(df.nlargest(n=3, columns=&#39;col1&#39;,keep=&#39;last&#39;))#컬럼1에서 가장 큰값 3개를 출력한다, 중복된 값은 마지막 값을 출력한다

           col4  col1  col2
row2 val2  19.0  20.0    21
     val5  16.0  17.0    18
row3 val2  13.0  14.0    15
</code></pre>
<p>중복값 모두 출력</p>
<pre><code class="language-python">print(df.nlargest(n=3,columns=&#39;col1&#39;,keep=&#39;all&#39;))#중복된 값도 모두 출력한다
&gt;&gt;
      col1  col2  col3
row2     5    18     5
row4     4    56    31
row5     2    33     3
row1     2     7    97
</code></pre>
<p><strong>여러 열을 동시에 고려하여 정렬</strong></p>
<p>여러 열을 동시에 고려하여 정렬하고자 한다면 <code>list</code>를 사용하면됩니다.</p>
<p><code>col1</code>과 <code>col3</code> 모두에서 큰 값 기준 정렬할 경우 아래와 같습니다.</p>
<pre><code class="language-python">Copyprint(df.nlargest(n=3,columns=[&#39;col1&#39;,&#39;col3&#39;]))
#만약 col1값이 같다면 col3까지 비교를 한다
&gt;&gt;
      col1  col2  col3
row2     5    18     5
row4     4    56    31
row1     2     7    97
#col1에서 중복인 row1, row5에 대해 col3의 값이 더 큰 row1이 출력</code></pre>
<h2 id="함수를-이용한-열-단위-결합-combine"><strong>함수를 이용한 열 단위 결합 (combine)</strong></h2>
<p><code>combine</code> 메서드는 두 pandas 객체를 <code>func</code>함수를 이용하여 결합하는 메서드입니다.</p>
<p><code>other</code> : 결합 할 DataFrame객체 입니다.
<code>func</code> : 결합에 이용할 함수 입니다.
<code>fill_value</code> : 결합하기전 <code>Na</code>의 값을 이 값으로 대체합니다.
<code>overwrite</code> : <code>other</code>에 존재하지 않는 <code>self</code>의 열의 값을 <code>NaN</code>으로 대체합니다.</p>
<p>먼저 <code>np.NaN</code>이 포함된 간단한 3x3짜리 데이터 2개를 만들어보겠습니다.</p>
<pre><code class="language-python">n=np.nan
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
row = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
data1 = [[1,3,4],
         [n,8,2],
         [2,6,7]]
data2 = [[7,2,3],
         [2,4,2],
         [3,1,5]]
df1 = pd.DataFrame(data1,row,col)
df2 = pd.DataFrame(data2,row,col)</code></pre>
<pre><code class="language-python">print(df1)
print(df2)

      col1  col2  col3
row1   1.0     3     4
row2   NaN     8     2
row3   2.0     6     7

      col1  col2  col3
row1     7     2     3
row2     2     4     2
row3     3     1     5</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p><code>func</code> 인수에 <code>np.maximum</code>을 입력하여 <code>df1</code>과 <code>df2</code>의 요소를 비교, 큰 값으로 결합하여 보겠습니다.</p>
<pre><code class="language-python">print(df1.combine(df2,np.maximum))
&gt;&gt;
      col1  col2  col3
row1   7.0     3     4
row2   NaN     8     2
row3   3.0     6     7</code></pre>
<p><strong>fill_value를 이용하여 결측치 채우기</strong></p>
<p><code>fill_value</code>에 값을 입력하면, 결측치가 해당 값으로 채워진 후 결합이 진행됩니다.</p>
<pre><code class="language-python">print(df1.combine(df2,np.maximum,fill_value=9))#결측값을 9로 채운다

      col1  col2  col3
row1   7.0     3     4
row2   9.0     8     2
row3   3.0     6     7</code></pre>
<p><code>col1</code>, <code>row2</code>의 값이 <code>NaN</code>에서 9로 변경 된후 <code>np.maximum</code>이 진행된 것을 확인할 수 있습니다.</p>
<p><strong>overwrite 인수의 사용</strong></p>
<p><code>overwrite</code>인수는 <code>other</code>에 존재하지 않는 <code>self</code>의 열의 요소를 <code>NaN</code>으로 변경하는 메서드입니다.
먼저 이해를 돕기 위해 2x2 데이터인 <code>df3</code>을 만들어 보겠습니다.</p>
<pre><code class="language-python">col3 = [&#39;col1&#39;,&#39;col2&#39;]
row3 = [&#39;row1&#39;,&#39;row2&#39;]
data3 = [[1,2],
         [3,4]]
df3 = pd.DataFrame(data3, row3, col3)
print(df3)
&gt;&gt;
      col1  col2
row1     1     2
row2     3     4</code></pre>
<p><code>overwrite</code>가 False일 경우 존재하지 않는 열에 대해서는 기존값으로 채워집니다.</p>
<pre><code class="language-python">print(df1.combine(df3, np.maximum,overwrite=False))
#존재하지 않는 열에 대해서는 기존값(df1)으로 채워진다

      col1  col2  col3
row1   1.0   3.0     4
row2   NaN   8.0     2
row3   NaN   NaN     7</code></pre>
<p><code>overwrite</code>가 True일 경우 존재하지 않는 열에 대해서는 <code>NaN</code>으로 채워집니다.
<code>col3</code>의 값이 모두 <code>NaN</code>으로 채워진 것을 확인할 수 있습니다.</p>
<pre><code class="language-python">print(df1.combine(df3, np.maximum,overwrite=True))#결측값으로 채워진다

      col1  col2  col3
row1   1.0   3.0   NaN
row2   NaN   8.0   NaN
row3   NaN   NaN   NaN</code></pre>
<h2 id="다른-객체로-결측치-덮어쓰기-combine_first"><strong>다른 객체로 결측치 덮어쓰기 (combine_first)</strong></h2>
<p><code>combine_first</code> 메서드는 <code>other</code>의 값으로 <code>self(df)</code>의 <code>NaN</code>값을 덮어쓰는 메서드입니다.</p>
<p><code>other</code> : <code>self</code>객체의 결측치를 덮어쓸 객체 입니다.</p>
<pre><code class="language-python">n=np.nan
col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
row = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
data1 = [[n,n,1],
         [n,n,1],
         [1,1,1]]
data2 = [[2,2,2],
         [2,n,2],
         [2,1,2]]
df1 = pd.DataFrame(data1,row,col)
df2 = pd.DataFrame(data2,row,col)
</code></pre>
<pre><code class="language-python">print(df1)
print(df2)

      col1  col2  col3
row1   NaN   NaN     1
row2   NaN   NaN     1
row3   1.0   1.0     1

      col1  col2  col3
row1     2   2.0     2
row2     2   NaN     2
row3     2   1.0     2</code></pre>
<p><strong>기본적인 사용법</strong></p>
<p><code>self</code>객체의 <code>NaN</code>값을 <code>other</code>객체의 같은위치의 인수로 덮어쓰기 합니다.
만약 <code>self</code>에서 <code>NaN</code>인 값이 <code>other</code>에서도 <code>NaN</code>이라면 <code>NaN</code>을 출력합니다.</p>
<pre><code class="language-python">print(df1.combine_first(df2))#df1에 df2를 덮어 쒸웁니다

      col1  col2  col3
row1   2.0   2.0     1
row2   2.0   NaN     1
row3   1.0   1.0     1</code></pre>
<h2 id="인덱스기준-병합-join"><strong>인덱스기준 병합 (join)</strong></h2>
<p><code>join</code> 메서드는 두 객체를 인덱스 기준으로 병합하는 메서드 입니다.</p>
<p><code>other</code> : <code>self</code>와 합칠 객체 입니다.
<code>on</code> : <code>self</code>의 열이나 인덱스 중에서 <code>other</code>의 어떤 열을 기준으로 결합할지 입니다.
즉, <code>other</code>의 (인덱스 기준이 아닌) 열 기준으로 결합할 때 <code>on</code>인수를 사용합니다.
<code>how</code> : {left : self기준 / right : other기준 / inner : 교집합 / outer : 합집합} 출력할 인덱스의 기준입니다.
<code>lsuffix / rsffix</code> : 이름이 중복되는 열이 있을 때 그 열에 추가로 붙일 접미사입니다.
<code>lsuffix</code>는 <code>self</code>의 열에 붙을 접미사고, <code>rsuffix</code>는 <code>other</code>의 열에 붙을 접미사입니다.
<code>sort</code> : 출력되는 데이터의 index를 사전적으로 정렬할지 여부입니다.</p>
<p>기본데이터 생성</p>
<pre><code class="language-python">df1 = pd.DataFrame({&#39;col1&#39;:[1,2,3]},index=[&#39;row3&#39;,&#39;row2&#39;,&#39;row1&#39;])
print(df1)
      col1
row3     1
row2     2
row1     3</code></pre>
<pre><code class="language-python">df2 = pd.DataFrame({&#39;col2&#39;:[13,14]},index=[&#39;row4&#39;,&#39;row3&#39;])
print(df2)
      col2
row4    13
row3    14</code></pre>
<pre><code class="language-python">df3 = pd.DataFrame({&#39;col1&#39;:[23,24]},index=[&#39;row4&#39;,&#39;row3&#39;])
print(df3)
      col1
row4    23
row3    24
</code></pre>
<pre><code class="language-python">df4 = pd.DataFrame({&#39;IDX&#39;:[&#39;A&#39;,&#39;B&#39;,&#39;C&#39;],&#39;col1&#39;:[1,2,3]})
print(df4)
  IDX  col1
0   A     1
1   B     2
2   C     3</code></pre>
<pre><code class="language-python">df5 = pd.DataFrame({&#39;IDX&#39;:[&#39;C&#39;,&#39;D&#39;],&#39;col2&#39;:[13,14]})
print(df5)
  IDX  col2
0   C    13
1   D    14</code></pre>
<p><strong>how를 통한 인덱스의 설정</strong></p>
<p><code>how</code>인수를 통해 인덱스의 기준을 어떤 값으로 할지 정할 수 있습니다
<code>how</code>=left인 경우 (기본값) <code>df1</code>의 인덱스를 기준으로 합니다.</p>
<pre><code class="language-python">print(df1.join(df2,how=&#39;left&#39;))
      col1  col2
row3     1  14.0
row2     2   NaN
row1     3   NaN</code></pre>
<p><code>how</code>=right인 경우 <code>df2</code>의 인덱스를 기준으로 합니다.</p>
<pre><code class="language-python">print(df1.join(df2,how=&#39;right&#39;))
      col1  col2
row4   NaN    13
row3   1.0    14</code></pre>
<p><code>how</code>=outer인 경우 <code>df1</code>와 <code>df2</code>의 인덱스의 합집합을 기준으로 합니다.</p>
<pre><code class="language-python">print(df1.join(df2,how=&#39;outer&#39;))
      col1  col2
row1   3.0   NaN
row2   2.0   NaN
row3   1.0  14.0
row4   NaN  13.0</code></pre>
<p><code>how</code>=inner인 경우 <code>df1</code>와 <code>df2</code>의 인덱스의 교집합을 기준으로 합니다.</p>
<pre><code class="language-python">print(df1.join(df2,how=&#39;inner&#39;))
      col1  col2
row3     1    14</code></pre>
<p><strong>sort 인수를 통한 인덱스의 정렬</strong></p>
<p><code>sort</code>인수를 <code>True</code>로 설정할 경우 인덱스의 값을 사전적으로 정렬 할 수 있습니다.
<code>sort</code>가 <code>False</code> 인경우(기본값)</p>
<pre><code class="language-python">print(df1.join(df2,how=&#39;left&#39;))
      col1  col2
row3     1  14.0
row2     2   NaN
row1     3   NaN</code></pre>
<p><code>sort</code>가 <code>True</code> 인경우 인덱스가 정렬 된 것을 확인할 수 있습니다.</p>
<pre><code class="language-python">print(df1.join(df2,how=&#39;left&#39;,sort=True))
      col1  col2
row1     3   NaN
row2     2   NaN
row3     1  14.0
</code></pre>
<p><strong>lsuffix / rsuffix 인수를 통해 중복 열 구분하</strong><code>df1</code>과 <code>df3</code>은 <code>col1</code>이라는 이름이 중복된 열을 가지기 때문에, <code>join</code>메서드를 사용할 경우 오류가 발생하게 됩니다.</p>
<p>이때, <code>lsuffix / rsuffix</code> 인수를 입력함으로서 기존 열 이름에 접미사를 붙일 수 있습니다.</p>
<pre><code class="language-python">print(df1.join(df3,how=&#39;outer&#39;,lsuffix=&quot;_left&quot;,rsuffix=&#39;_right&#39;))
      col1_left  col1_right
row1        3.0         NaN
row2        2.0         NaN
row3        1.0        24.0
row4        NaN        23.0
</code></pre>
<p><strong>인덱스가 아닌 열 기준으로 결합하기(+ on 인수의 사용)</strong> 먼저 <code>IDX</code>라는 이름의 열을 갖는 두 객체를 생성해보겠습니다.</p>
<pre><code class="language-python">df4 = pd.DataFrame({&#39;IDX&#39;:[&#39;A&#39;,&#39;B&#39;,&#39;C&#39;],&#39;col1&#39;:[1,2,3]})
print(df4)
  IDX  col1
0   A     1
1   B     2
2   C     3
</code></pre>
<pre><code class="language-python">df5 = pd.DataFrame({&#39;IDX&#39;:[&#39;C&#39;,&#39;D&#39;],&#39;col2&#39;:[13,14]})
print(df5)
  IDX  col2
0   C    13
1   D    14
</code></pre>
<hr>
<p><code>join</code>메서드는 기본적으로 index를 기준으로 결합하기 때문에, 열 기준으로 결합하기 위해서는</p>
<p><code>set_index</code>메서드를 활용해 열을 인덱스로 변경하여 <code>join</code>메서드를 사용하면 됩니다.</p>
<pre><code class="language-python">print(df4.set_index(&#39;IDX&#39;).join(df5.set_index(&#39;IDX&#39;)))
IDX
A       1   NaN
B       2   NaN
C       3  13.0
</code></pre>
<p>하지만 위와 같이 진행 할 경우 기존 인덱스가 열 값으로 변경됩니다.</p>
<p>이를 방지하고 순수하게 열 기준으로 병합하려면 <code>on</code> 인수를 사용하면 됩니다.</p>
<pre><code class="language-python">print(df4.join(df5.set_index(&#39;IDX&#39;),on=&#39;IDX&#39;))
  IDX  col1  col2
0   A     1   NaN
1   B     2   NaN
2   C     3  13.0
</code></pre>
<h2 id="객체병합-merge"><strong>객체병합 (merge)</strong></h2>
<p><code>merge</code>메서드는 두 객체를 병합하는 메서드입니다. <code>join</code>과 비슷하지만 더 세부적인 설정이 가능한 메서드로,</p>
<p>인덱스-열 기준 병합도 가능하며, <code>indicator</code>인수를 통한 병합정보확인, <code>validate</code>를 통한 병합방식 확인등이 가능합니다.</p>
<p>left.merge(right, how=&#39;inner&#39;, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=(&#39;_x&#39;, &#39;_y&#39;), copy=True, indicator=False, validate=None)</p>
<p><code>right</code>: <code>left</code>와 함께 병합할 객체입니다.</p>
<p><code>how</code> : 병합시 기준이 될 인덱스를 정하는 방식입니다. left는 기존객체, right는 병합할 객체, inner은 두 객체의 인덱스의 교집합, outer은 두 객체의 인덱스의 합집합, cross는 행렬곱 입니다.</p>
<p><code>on</code> : 열 기준 병합시 기준으로할 열의 이름이 양측이 동일하다면, <code>on</code>인수에 입력함으로써 기준 열을 정할 수 있습니다.</p>
<p><code>left_on / right_on</code> : 열기준 병합 시 기준으로 할 열의 양측 이름이 다르다면, 각각 어떤 열을 기준으로 할지 정해줍니다.</p>
<p>열의 이름을 입력하면 됩니다.</p>
<p><code>left_index / right_index</code> : 인덱스 기준 병합 시 <code>True</code>로 하면 해당 객체의 인덱스가 병합 기준이됩니다.</p>
<blockquote>
<p>※ 즉 left_on을 입력하고 right_index를 True로 한다면 열-인덱스 기준 병합도 가능합니다.</p>
</blockquote>
<p><code>sort</code> : 병합 후 인덱스의 사전적 정렬 여부입니다. <code>join</code>메서드와 기능이 동일하므로 참고 바랍니다.</p>
<p><code>suffixes</code> : 병합할 객체들간 이름이 중복되는 열이 있다면, 해당 열에 붙일 접미사를 정합니다.</p>
<p>기본적으로 <code>join</code>메서드의 <code>lsuffix / rsuffix</code>와 기능이 동일하지만, <code>suffixes</code>인수는 튜플로 두 값을</p>
<p>한번에 입력한다는 차이가 있습니다.</p>
<p><code>copy</code> : 사본을 생성할지 여부입니다.</p>
<p><code>indicator</code> : <code>True</code>로 할경우 병합이 완료된 객체에 추가로 열을 하나 생성하여 병합 정보를 출력합니다.</p>
<p><code>validate</code> : {&#39;1:1&#39; / &#39;1:m&#39; / &#39;m:1&#39; / &#39;m:m&#39;} 병합 방식에 맞는지 확인할 수 있습니다. 만약 <code>validate</code>에 입력한 병합방식과, 실제 병합 방식이 다를경우 오류가 발생됩니다.</p>
<p>예를들어, <code>validate=&quot;1:m&quot;</code>으로 입력하였는데, 실제로 m:1 병합방식일 경우 오류가 발생됩니다.</p>
<p><strong>열 기준으로 병합 (left_on / right_on)</strong></p>
<p><code>left_on / right_on</code>에 열 이름을 입력하므로서 열 기준으로 병합이 가능합니다.
먼저 객체 2개를 만들어 보겠습니다.</p>
<pre><code class="language-python">df1 = pd.DataFrame({&#39;IDX1&#39;:[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;a&#39;],&#39;VAL&#39;:[1,2,3,4]})
print(df1)
  IDX1  VAL
0    a    1
1    b    2
2    c    3
3    a    4</code></pre>
<pre><code class="language-python">df2 = pd.DataFrame({&#39;IDX2&#39;:[&#39;a&#39;,&#39;c&#39;,&#39;d&#39;],&#39;VAL&#39;:[5,6,7]})
print(df2)
  IDX2  VAL
0    a    5
1    c    6
2    d    7</code></pre>
<p><code>df1</code>에서는 <code>IDX1</code>을, <code>df2</code>에서는 <code>IDX2</code>를 기준으로 하여 두 객체를 병합하겠습니다.
<code>IDX1</code>과 <code>IDX2</code>의 값을 매칭하여 병합된 후 이름이 같은 <code>VAL</code>열에 대해서는 _x와 _y가 붙었습니다.</p>
<pre><code class="language-python">print(df1.merge(df2, left_on=&#39;IDX1&#39;,right_on=&#39;IDX2&#39;))
  IDX1  VAL_x IDX2  VAL_y
0    a      1    a      5
1    c      3    c      6
2    a      4    a      5</code></pre>
<p><strong>suffixes를 통한 동명인 열 구분</strong></p>
<p><code>suffixes</code>에 <code>(&#39;_left&#39;, &#39;_right&#39;)</code>를 입력하므로써 열 이름에 _left, _right를 붙일 수 있습니다.</p>
<pre><code class="language-python">print(df1.merge(df2, left_on=&#39;IDX1&#39;,right_on=&#39;IDX2&#39;,suffixes = (&#39;_left&#39;,&#39;_right&#39;)))
  IDX1  VAL_left IDX2  VAL_right
0    a         1    a          5
1    c         3    c          6
2    a         4    a          5</code></pre>
<p><strong>인덱스 기준으로 병합(left_index / right_index)</strong></p>
<p><code>left_index / right_index</code>를 통해 인덱스 기준으로 두 객체를 병합할 수 있습니다.</p>
<p>먼저 병합할 두 객체를 만들어보겠습니다.</p>
<pre><code class="language-python">df3 = pd.DataFrame({&#39;VAL1&#39;:[1,2,3]},index=[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;])
print(df3)
&gt;&gt;
      VAL1
row1     1
row2     2
row3     3</code></pre>
<pre><code class="language-python">df4 = pd.DataFrame({&#39;VAL2&#39;:[4,5,6]},index=[&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;])
print(df4)
&gt;&gt;
      VAL2
row2     4
row3     5
row4     6</code></pre>
<p><code>left_index</code>와 <code>right_index</code>를 <code>True</code>로 입력하여 두 객체 모두 인덱스를 기준으로 병합할 수 있습니다.</p>
<pre><code class="language-python">print(df3.merge(df4, left_index=True,right_index=True))
      VAL1  VAL2
row2     2     4
row3     3     5</code></pre>
<p><strong>열과 인덱스를 혼합하여 병합하기</strong></p>
<p><code>left_on / right_on</code> 과 <code>left_index / right_index</code>를 이용하여 양쪽의 기준을 설정해줌으로서, 인덱스와 열의 혼합 병합도 가능합니다.</p>
<p>예시를 위해서 새 객체 두개를 만들어보겠습니다.</p>
<p><code>df5</code>는 인덱스를, <code>df6</code>은 열을 기준으로 하겠습니다.</p>
<pre><code class="language-python">df5 = pd.DataFrame({&#39;VAL1&#39;:[1,2,3]},index=[&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;])
print(df5)
&gt;&gt;
      VAL1
row1     1
row2     2
row3     3
</code></pre>
<pre><code class="language-python">df6 = pd.DataFrame({&#39;IDX&#39;:[&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;],&#39;VAL2&#39;:[4,5,6]})
print(df6)
&gt;&gt;
    IDX  VAL2
0  row2     4
1  row3     5
2  row4     6</code></pre>
<p>이제 <code>left_index</code>는 <code>True</code>로하여 인덱스를 기준으로하고 <code>right_on</code>은 <code>IDX</code>로 하여 열 기준으로 병합하겠습니다.</p>
<pre><code class="language-python">print(df5.merge(df6, left_index=True,right_on=&#39;IDX&#39;))
   VAL1   IDX  VAL2
0     2  row2     4
1     3  row3     5</code></pre>
<p><strong>how 인수의 사용</strong></p>
<p><code>how</code>인수를 사용하여 병합된 객체의 인덱스의 기준을 정할 수 있습니다.</p>
<p>먼저 예시에 이용될 두 객체를 만들어 보겠습니다.</p>
<pre><code class="language-python">df7 = pd.DataFrame({&#39;IDX&#39;:[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;a&#39;],&#39;VAL&#39;:[1,2,3,4]})
print(df7)
&gt;&gt;
  IDX  VAL
0   a    1
1   b    2
2   c    3
3   a    4
</code></pre>
<pre><code class="language-python">Copydf8 = pd.DataFrame({&#39;IDX&#39;:[&#39;a&#39;,&#39;c&#39;,&#39;d&#39;],&#39;VAL&#39;:[5,6,7]})
print(df8)
&gt;&gt;
  IDX  VAL
0   a    5
1   c    6
2   d    7
</code></pre>
<p><code>how</code>=left인 경우 왼쪽 객체의 인덱스를 기준으로 합니다.</p>
<pre><code class="language-python">print(df7.merge(df8,how=&#39;left&#39;,on=&#39;IDX&#39;))
  IDX  VAL_x  VAL_y
0   a      1    5.0
1   b      2    NaN
2   c      3    6.0
3   a      4    5.0</code></pre>
<p><code>how</code>=right인 경우 오른쪽 객체의 인덱스를 기준으로 합니다.</p>
<pre><code class="language-python">print(df7.merge(df8,how=&#39;right&#39;,on=&#39;IDX&#39;))
  IDX  VAL_x  VAL_y
0   a    1.0      5
1   a    4.0      5
2   c    3.0      6
3   d    NaN      7</code></pre>
<p><code>how</code>=inner인 경우 양쪽 객체 모두가 공통으로 갖는 인덱스를 기준으로 합니다.(교집합)</p>
<pre><code class="language-python">print(df7.merge(df8,how=&#39;inner&#39;,on=&#39;IDX&#39;))
&gt;&gt;
  IDX  VAL_x  VAL_y
0   a      1      5
1   a      4      5
2   c      3      6
</code></pre>
<p><code>how</code>=outer인 경우 양쪽 객체의 인덱스 모두를 기준으로 합니다.(합집합)</p>
<pre><code class="language-python">print(df7.merge(df8,how=&#39;outer&#39;,on=&#39;IDX&#39;))
&gt;&gt;
  IDX  VAL_x  VAL_y
0   a    1.0    5.0
1   a    4.0    5.0
2   b    2.0    NaN
3   c    3.0    6.0
4   d    NaN    7.0
</code></pre>
<p>※cross에 대해서는 뒤에 후술하겠습니다.</p>
<p><strong>indicator인수를 통한 병합 정보 출력</strong></p>
<p><code>indicator</code>인수를 <code>True</code>로 할 경우 마지막 열에 <code>_merge</code>열을 추가하여 병합 정보를 출력합니다.</p>
<pre><code class="language-python">print(df7.merge(df8,how=&#39;outer&#39;,on=&#39;IDX&#39;,indicator=True))
&gt;&gt;
  IDX  VAL_x  VAL_y      _merge
0   a    1.0    5.0        both
1   a    4.0    5.0        both
2   b    2.0    NaN   left_only
3   c    3.0    6.0        both
4   d    NaN    7.0  right_only
</code></pre>
<p><strong>validate를 통한 병합방식 검증</strong></p>
<p><code>validate</code>인수에 값을 입력하여 해당 병합방식이 맞는지 검증이 가능합니다. 병합 방식이 다를경우 오류를 출력합니다.</p>
<p><code>1:m</code>인지 검증</p>
<pre><code class="language-python">print(df7.merge(df8,how=&#39;outer&#39;,on=&#39;IDX&#39;,validate=&#39;1:m&#39;))
&gt;&gt;
오류발생
pandas.errors.MergeError: Merge keys arenot uniquein left dataset;not a one-to-many merge
</code></pre>
<p><code>m:1</code>인지 검증. 병합 방식이 m:1이 맞기 때문에 결과값을 출력합니다.</p>
<pre><code class="language-python">print(df7.merge(df8,how=&#39;outer&#39;,on=&#39;IDX&#39;,validate=&#39;m:1&#39;))
&gt;&gt;
  IDX  VAL_x  VAL_y
0   a    1.0    5.0
1   a    4.0    5.0
2   b    2.0    NaN
3   c    3.0    6.0
4   d    NaN    7.0
</code></pre>
<p><strong>how인수에 cross를 적용하는 경우</strong></p>
<p><code>how</code>인수중 cross는 행렬의 곱집합을 의미합니다. 단순히 말하면 행렬의 모든 경우의수를 출력합니다.</p>
<p>예시를 위해 두 객체를 생성해보겠습니다.</p>
<pre><code class="language-python">df9 = pd.DataFrame({&#39;IDX1&#39;:[&#39;a&#39;,&#39;b&#39;]})
print(df9)
&gt;&gt;
  IDX1
0    a
1    b
</code></pre>
<pre><code class="language-python">df10 = pd.DataFrame({&#39;IDX2&#39;:[&#39;c&#39;,&#39;d&#39;]})
print(df10)
&gt;&gt;
  IDX2
0    c
1    d
</code></pre>
<p>이제 <code>how</code>인수에 cross를 입력하므로써 두 객체의 행렬곱을 출력하겠습니다.</p>
<pre><code class="language-python">print(df9.merge(df10,how=&#39;cross&#39;))
&gt;&gt;
  IDX1 IDX2
0    a    c
1    a    d
2    b    c
3    b    d</code></pre>
<h2 id="객체-병합_결측제어-가능-align"><strong>객체 병합_결측제어 가능 (align)</strong></h2>
<p><code>align</code>메서드는 두 객체를 특정 기준들에 맞추어 정렬하는 메서드입니다.</p>
<p><code>두개의 데이터를 튜플 형태로 반환</code>한다는것을 반드시 명심하시기 바랍니다.</p>
<p>인수들에 따라 다양한 구현이 가능하므로 아래 사용법을 참고 바랍니다.</p>
<p>self.align(other, join=&#39;outer&#39;, axis=None, level=None, copy=True, fill_value=None, method=None, limit=None, fill_axis=0, broadcast_axis=None)</p>
<p><code>other</code> : <code>self</code>와 함께 정렬할 객체 입니다.</p>
<p><code>join</code> : {inner / left / right / outer} 정렬 기준이 될 인덱스 입니다. inner이면 교집합, left면 <code>self</code>의 인덱스, right면 <code>other</code>의 인덱스, outer이면 합집합으로 인덱스를 사용합니다.</p>
<p><code>axis</code> : {0 : index / 1 : columns} 정렬할 레이블입니다. 기본값으로 두 축 모두 정렬합니다.</p>
<p><code>level</code> : multi index의 경우 실행할 수준(level)을 설정합니다.</p>
<p><code>copy</code> : 사본을 생성할지의 여부입니다.</p>
<p><code>fill_value</code> : 결측치를 어떤 값으로 채울지의 여부입니다. 기존 객체에 포함된 결측치의 경우는 바뀌지 않습니다.</p>
<p><code>method</code> : {ffill / bfill} 결측치를 어떻게 채울지 여부입니다. ffill의 경우 위의값과 동일하게, bfill의 경우 아래 값과 동일하게 채웁니다.</p>
<p><code>limit</code> : 결측치를 몇개나 채울지 여부입니다. <code>limit</code>에 설정된 갯수만큼만 결측치를 변경합니다.</p>
<p><code>fill_axis</code> : {0 : index / 1 : columns} <code>method</code>와 <code>limit</code>를 가로로 적용할지 세로로 적용할지 여부입니다.</p>
<p><code>broadcast_axis</code> : {0 : index / 1 : columns} 어느 축을 기준으로 브로드캐스트할지 여부입니다.</p>
<p>브로드캐스트란 서로 차원이 다른 두 객체에 대해서 저차원 데이터의 차원을 고차원 데이터에 맞추는 과정입니다.</p>
<p><strong>기본 사용법</strong></p>
<p>먼저 일부 레이블을 공유하는 3x3짜리 데이터 2개를 만들어보겠습니다.</p>
<p>전체적으로 보면 아래와 같습니다.(빨강이 df1, 파랑이df2, 녹색이 레이블이 겹치는구간)</p>
<table>
<thead>
<tr>
<th>index</th>
<th>col1</th>
<th>col2</th>
<th>col3</th>
<th>col4</th>
</tr>
</thead>
<tbody><tr>
<td><strong>row1</strong></td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>x</td>
</tr>
<tr>
<td><strong>row2</strong></td>
<td>5</td>
<td>6</td>
<td>7</td>
<td>x</td>
</tr>
<tr>
<td><strong>row3</strong></td>
<td>9</td>
<td>10</td>
<td>11</td>
<td>12</td>
</tr>
<tr>
<td><strong>row4</strong></td>
<td>x</td>
<td>14</td>
<td>NA</td>
<td>16</td>
</tr>
<tr>
<td><strong>row5</strong></td>
<td>x</td>
<td>18</td>
<td>19</td>
<td>20</td>
</tr>
</tbody></table>
<p>편의를 위해 겹치는 부분의 값을 동일하게 했습니다</p>
<p><code>두개의 데이터를 튜플 형태로 반환</code>하기 때문에, 달라도 상관없습니다.</p>
<pre><code class="language-python">n=np.NaN
col1 = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
row1 = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
data1 = [[1,2,3],[5,6,7],[9,n,11]]

col2 = [&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;]
row2 = [&#39;row3&#39;,&#39;row4&#39;,&#39;row5&#39;]
data2 = [[10,11,12],[14,n,16],[18,19,20]]

df1 = pd.DataFrame(data1,row1,col1)
df2 = pd.DataFrame(data2,row2,col2)
</code></pre>
<pre><code class="language-python">print(df1)
&gt;&gt;
      col1  col2  col3
row1     1   2.0     3
row2     5   6.0     7
row3     9   NaN    11
</code></pre>
<pre><code class="language-python">print(df2)
&gt;&gt;
      col2  col3  col4
row3    10  11.0    12
row4    14   NaN    16
row5    18  19.0    20
</code></pre>
<hr>
<p><strong>join 인수의 사용을 통한 레이블 설정</strong></p>
<p><code>join</code> 인수를 이용해 {outer : 합집합 / left : df1기준 / right : df2기준 / inner : 교집합} 인 index로 출력합니다.</p>
<p><code>두개의 데이터를 튜플 형태로 반환</code>하기 때문에 리스트 슬라이싱으로 따로 <code>print</code>를 진행해보겠습니다.</p>
<p><code>outer</code>로 출력시 레이블이 <code>df1</code>과 <code>df2</code> 모두의 합집합으로 사용되고 있는것을 알 수 있습니다.</p>
<pre><code class="language-python">print(df1.align(df2,join=&#39;outer&#39;)[0])
print(df1.align(df2,join=&#39;outer&#39;)[1])

      col1  col2  col3  col4
row1   1.0   2.0   3.0   NaN
row2   5.0   6.0   7.0   NaN
row3   9.0   NaN  11.0   NaN
row4   NaN   NaN   NaN   NaN
row5   NaN   NaN   NaN   NaN
      col1  col2  col3  col4
row1   NaN   NaN   NaN   NaN
row2   NaN   NaN   NaN   NaN
row3   NaN  10.0  11.0  12.0
row4   NaN  14.0   NaN  16.0
row5   NaN  18.0  19.0  20.0</code></pre>
<p><code>left</code>로 출력시 <code>df1</code>의 레이블만 사용되는 것을 알 수 있습니다.</p>
<pre><code class="language-python">print(df1.align(df2,join=&#39;left&#39;)[0])
print(df1.align(df2,join=&#39;left&#39;)[1])
      col1  col2  col3
row1     1   2.0     3
row2     5   6.0     7
row3     9   NaN    11
      col1  col2  col3
row1   NaN   NaN   NaN
row2   NaN   NaN   NaN
row3   NaN  10.0  11.0</code></pre>
<p><code>right</code>로 출력시 <code>df2</code>의 레이블만 사용되는 것을 알 수 있습니다.</p>
<pre><code class="language-python">print(df1.align(df2,join=&#39;right&#39;)[0])
print(df1.align(df2,join=&#39;right&#39;)[1])
      col2  col3  col4
row3   NaN  11.0   NaN
row4   NaN   NaN   NaN
row5   NaN   NaN   NaN
      col2  col3  col4
row3    10  11.0    12
row4    14   NaN    16
row5    18  19.0    20</code></pre>
<p><code>inner</code>로 출력시 레이블이 <code>df1</code>과 <code>df2</code> 모두의 교집합으로 사용되고 있는것을 알 수 있습니다.</p>
<pre><code class="language-python">print(df1.align(df2,join=&#39;inner&#39;)[0])
print(df1.align(df2,join=&#39;inner&#39;)[1])

      col2  col3
row3   NaN    11
      col2  col3
row3    10  11.0</code></pre>
<p><strong>axis 인수의 사용을 통한 정렬 축 설정</strong></p>
<p><code>axis</code>인수를 통해 정렬을 진행 할 축을 정할 수 있습니다. 기본적으로 두축 모두 입니다.</p>
<p><code>df1</code>에 대해서만 <code>inner</code>로 출력하여 확인해보겠습니다.</p>
<p><code>axis</code>를 0으로 하였을 경우 행 기준 <code>inner</code>인 <code>row3</code>만 정렬되었습니다.</p>
<pre><code class="language-python">print(df1.align(df2,join=&#39;inner&#39;,axis=1)[0])
      col2  col3
row1   2.0     3
row2   6.0     7
row3   NaN    11</code></pre>
<p><strong>fill_value를 사용한 결측치 입력</strong></p>
<p><code>fill_value</code>를 사용해서 결측치를 원하는 값으로 변경이 가능합니다.</p>
<p>단, 기존 객체에 입력되어있던 결측치의 경우 변경되지 않습니다.</p>
<pre><code class="language-python">print(df1.align(df2,join=&#39;outer&#39;,fill_value=&#39;X&#39;)[0])
print(df1.align(df2,join=&#39;outer&#39;,fill_value=&#39;X&#39;)[1])

     col1 col2 col3 col4
row1    1  2.0    3    X
row2    5  6.0    7    X
row3    9  NaN   11    X
row4    X    X    X    X
row5    X    X    X    X
     col1 col2  col3 col4
row1    X    X     X    X
row2    X    X     X    X
row3    X   10  11.0   12
row4    X   14   NaN   16
row5    X   18  19.0   20</code></pre>
<p><strong>method / limit인수를 사용한 결측치 보정</strong></p>
<p><code>method</code>인수는 {ffill / bfill}를 이용해 위쪽 또는 아래쪽 값으로 결측치 보정이 가능합니다.</p>
<p><code>limit</code>인수의 경우는 <code>method</code>인수를 통해 결측치 보정할 때, 몇개의 값을 보정할지 설정합니다.</p>
<p><code>ffill</code>로 입력 시 결측값을 바로 위의 값과 동일하게, <code>bfill</code>로 입력 시 결측값을 바로 아래 값과 동일하게 변경 된것을 확인할 수 있습니다.</p>
<pre><code class="language-python">print(df1.align(df2,join=&#39;outer&#39;,method=&#39;ffill&#39;)[0])
print(df1.align(df2,join=&#39;outer&#39;,method=&#39;bfill&#39;)[1])
&gt;&gt;
      col1  col2  col3  col4
row1   1.0   2.0   3.0   NaN
row2   5.0   6.0   7.0   NaN
row3   9.0   6.0  11.0   NaN
row4   9.0   6.0  11.0   NaN
row5   9.0   6.0  11.0   NaN
      col1  col2  col3  col4
row1   NaN  10.0  11.0  12.0
row2   NaN  10.0  11.0  12.0
row3   NaN  10.0  11.0  12.0
row4   NaN  14.0  19.0  16.0
row5   NaN  18.0  19.0  20.0
</code></pre>
<p><code>limit</code> 설정시 각 레이블에 대해서 아래와 같이 설정한 갯수만 변경 됩니다.</p>
<pre><code class="language-python">print(df1.align(df2,join=&#39;outer&#39;,method=&#39;bfill&#39;,limit=1)[1])
&gt;&gt;
      col1  col2  col3  col4
row1   NaN   NaN   NaN   NaN
row2   NaN  10.0  11.0  12.0
row3   NaN  10.0  11.0  12.0
row4   NaN  14.0  19.0  16.0
row5   NaN  18.0  19.0  20.0
</code></pre>
<p><strong>fill_axis 인수의 사용</strong></p>
<p><code>fill_axis</code>는 <code>method</code>및 <code>limit</code>를 어느축 기준으로 실행할지 여부입니다. 즉, 가로로 할지 세로로할지 여부입니다.</p>
<pre><code class="language-python">print(df1.align(df2,join=&#39;outer&#39;,method=&#39;ffill&#39;,fill_axis=0)[0])
print(df1.align(df2,join=&#39;outer&#39;,method=&#39;ffill&#39;,fill_axis=1)[0])
&gt;&gt;
      col1  col2  col3  col4
row1   1.0   2.0   3.0   NaN
row2   5.0   6.0   7.0   NaN
row3   9.0   6.0  11.0   NaN
row4   9.0   6.0  11.0   NaN
row5   9.0   6.0  11.0   NaN
      col1  col2  col3  col4
row1   1.0   2.0   3.0   3.0
row2   5.0   6.0   7.0   7.0
row3   9.0   9.0  11.0  11.0
row4   NaN   NaN   NaN   NaN
row5   NaN   NaN   NaN   NaN</code></pre>
<h2 id="업데이트-update"><strong>업데이트 (update)</strong></h2>
<p><code>update</code>메서드는 DataFrame의 열을 <code>other</code>객체의 동일한 열의 값으로 덮어씌우는 메서드입니다.</p>
<p>반환값 없이 원본이 변경됩니다.</p>
<p>self.update(other, join=&#39;left&#39;, overwrite=True, filter_func=None, errors=&#39;ignore&#39;)</p>
<p><code>other</code> : <code>self</code>에 덮어씌울 객체 입니다.</p>
<p><code>join</code> : {left} 기준이 될 인덱스 입니다. left만 선택 가능하므로 무시해도됩니다.</p>
<p><code>overwrite</code> : {True / False} 덮어씌울 방식입니다. True면 <code>self</code>의 모든 데이터에 <code>other</code>을 덮어씌웁니다.</p>
<p>False면 <code>self</code>에서 <code>Na</code>인 값에 대해서만 덮어씌우기를 진행합니다.</p>
<p><code>filter_func</code> : 덮어씌울값을 함수로 정할 수 있습니다.</p>
<p><code>errors</code> : {raise / ignore} raise일 경우 <code>self</code>와 <code>other</code> 모두 <code>Na</code>가 아닌 값이 있을경우 오류를 발생시킵니다.</p>
<pre><code class="language-python">df1 = pd.DataFrame({&#39;A&#39;:[1,2,3],&#39;B&#39;:[n,5,6]})
print(df1)
&gt;&gt;
   A    B
0  1  NaN
1  2  5.0
2  3  6.0
</code></pre>
<pre><code class="language-python">df2 = pd.DataFrame({&#39;B&#39;:[24,n,26],&#39;C&#39;:[37,38,39]})
print(df2)
&gt;&gt;
      B   C
0  24.0  37
1   NaN  38
2  26.0  39</code></pre>
<hr>
<p><strong>overwrite인수로 업데이트 방식 설정</strong></p>
<p><code>overwrite</code>인수가 <code>True</code>면 <code>df1</code>과 <code>df2</code>가 이름을 공유하는 열에 대해서 <code>df2</code>의 값을 <code>df1</code>에 덮어씌웁니다.</p>
<p><code>False</code>일 경우 <code>df1</code>에서 <code>Na</code>인 값에 대해서만 덮어씌우기를 진행합니다.</p>
<p>※ <code>df2</code>에서 <code>Na</code>인 값의 경우 덮어씌워지지 않습니다.</p>
<p><code>overwrite</code>=<code>True</code>일 경우(기본값)</p>
<pre><code class="language-python">df1.update(df2,overwrite=True)
print(df1)
&gt;&gt;
   A     B   # df1의 Na를 포함 덮어씌우기가 진행됨. 5의 경우 df2의 값이 Na이므로 무시
0  1  24.0
1  2   5.0
2  3  26.0
</code></pre>
<p><code>overwrite</code>=<code>False</code>일 경우</p>
<pre><code class="language-python">df1.update(df2,overwrite=False)
print(df1)
&gt;&gt;
   A     B  # df1에서 Na인 값에 대해서만 업데이트가 진행됨.
0  1  24.0
1  2   5.0
2  3   6.0
</code></pre>
<p><strong>filter_func로 원하는 값만 업데이트</strong></p>
<p><code>filter_func</code>에 함수를 넣음으로서 원하는 값만 업데이트가 가능합니다.</p>
<p>6인 값에 대해서만 업데이트를 하도록 <code>filter_func</code>를 설정하겠습니다</p>
<pre><code class="language-python">df1.update(df2,filter_func=lambda x: x==6)
print(df1)
&gt;&gt;
   A     B   #df1에서 6인 값에 대해서만 업데이트가 진행됨.
0  1   NaN
1  2   5.0
2  3  26.0
</code></pre>
<p><strong>errors인수의 사용법</strong></p>
<p><code>errors</code>인수를 <code>raise</code>로 할 경우 <code>df1</code>과 <code>df2</code> 모두 같은 위치에 <code>Na</code>가 아닌 값이 있을 경우 오류를 발생시킵니다.</p>
<pre><code class="language-python">Copydf1.update(df2,errors=&#39;raise&#39;)
print(df1)
&gt;&gt;
오류발생
ValueError: Data overlaps.</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025-04-10]]></title>
            <link>https://velog.io/@smile_07/2025-04-10</link>
            <guid>https://velog.io/@smile_07/2025-04-10</guid>
            <pubDate>Thu, 10 Apr 2025 11:30:45 GMT</pubDate>
            <description><![CDATA[<h2 id="초과-미만-이상-이하-같음-다름-gt-lt-ge-le-eq-ne"><strong>초과, 미만, 이상, 이하, 같음, 다름 (gt, lt, ge, le, eq, ne)</strong></h2>
<p><strong>pandas.DataFrame.gt(other, axis=&#39;columns&#39;, level=None) <code>&gt;</code>pandas.DataFrame.lt(other, axis=&#39;columns&#39;, level=None) <code>&lt;</code>pandas.DataFrame.ge(other, axis=&#39;columns&#39;, level=None) <code>&gt;=</code>pandas.DataFrame.le(other, axis=&#39;columns&#39;, level=None) <code>&lt;=</code>pandas.DataFrame.eq(other, axis=&#39;columns&#39;, level=None) <code>==</code>pandas.DataFrame.ne(other, axis=&#39;columns&#39;, level=None) <code>!=</code></strong></p>
<p><code>lt</code>, <code>gt</code>, <code>le</code>, <code>ge</code>, <code>eq</code>, <code>ne</code> 메서드는 DataFrame의 크기 비교를 수행하는 메서드입니다.
각각 <code>&gt;</code>, <code>&lt;</code>, <code>&gt;=</code>, <code>&lt;=</code>, <code>==</code>, <code>!=</code>와 용도가 같습니다. 그리고 각 메서드는 사용법이 동일합니다.
※각각 <code>less than</code>, <code>grater than</code>, <code>less equal</code>, <code>grater equal</code>, <code>equal</code>, <code>not equal</code>을 뜻합니다.</p>
<p><code>other</code> : 스칼라, 시퀀스, Series, DataFrame, list등이 올 수 있습니다. 비교하고자 하는 값입니다.
<code>axis</code> : {0 : index / 1 : columns} 비교할 레이블 입니다.
<code>level</code> : 멀티인덱스 사용시 비교할 레이블의 레벨입니다.</p>
<p>객체생성</p>
<pre><code class="language-python">col = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
row = [&#39;A&#39;,&#39;B&#39;,&#39;C&#39;]
df = pd.DataFrame(data=[[10,20,10],
                        [80,30,60],
                        [20,10,70]],index=row,columns=col)
df

&gt;&gt;
   col1  col2  col3
A    10    20    10
B    80    30    60
C    20    10    70</code></pre>
<p>스칼라와의 비교시에는 단순히 <code>other</code>에 스칼라값을 입력하는것으로 실행할 수 있습니다.
비교 결과는 <code>bool</code>로 표시됩니다.</p>
<pre><code class="language-python">print(df.eq(10)) # 10과 같은 경우 True 표시
&gt;&gt;

    col1   col2   col3
A   True  False   True
B  False  False  False
C  False   True  False</code></pre>
<p>Series로 입력할 경우 Series의 index를 통해 비교할 레이블의 설정이 가능합니다.</p>
<pre><code class="language-python">s1 = pd.Series([10,30],index=[&quot;col1&quot;,&quot;col3&quot;])
print(df.gt(s1)) # col1에서 10이상, col3에서 30이상이면 True
&gt;&gt;
    col1   col2   col3
A  False  False  False
B   True  False   True
C   True  False   True</code></pre>
<p>만약 존재하지 않는 레이블을 비교한다면, 해당 레이블이 생성(broadcast)됩니다.</p>
<pre><code class="language-python">s2 = pd.Series([10],index=[&quot;col4&quot;])
print(df.lt(s2)) # df에는 col4가 없기 때문에 col4가 브로드캐스트 됩니다.
&gt;&gt;
    col1   col2   col3   col4
A  False  False  False  False
B  False  False  False  False
C  False  False  False  False</code></pre>
<p><strong>axis에 따른 비교의 차이</strong></p>
<pre><code class="language-python">print(df.le([10,20,30], axis=&quot;columns&quot;)) # 열 기준으로 비교했을때 각각 10, 20, 30 이하면 True
&gt;&gt;
    col1   col2   col3
A   True   True   True
B  False  False  False
C  False   True  False</code></pre>
<pre><code class="language-python">print(df.le([10,20,30], axis=&quot;index&quot;)) # 행 기준으로 비교했을때 각각 10,20,30 이하면 True
&gt;&gt;
    col1   col2   col3
A   True  False   True
B  False  False  False
C   True   True  False</code></pre>
<p><strong>DataFrame과의 비교</strong></p>
<p>Series와 마찬가지로 특정 레이블이 일치하는 DataFrame과의 비교가 가능합니다.</p>
<p>※ 레이블이 일치하지 않을경우 해당 레이블이 생성(broadcast)됩니다.</p>
<p>먼저 간단한 3x1 짜리 DataFrame을 하나 만들어보겠습니다.</p>
<pre><code class="language-python">df2 = pd.DataFrame([[50],[50],[50]],index=row,columns=[&#39;col1&#39;])
print(df2)
&gt;&gt;
   col1
A    50
B    50
C    50
</code></pre>
<p>이제 <code>df</code>와 비교해보겠습니다.</p>
<pre><code class="language-python">print(df.ge(df2)) # col1에 대해서 각각50, 50, 50 이상이면 True
&gt;&gt;
    col1   col2   col3
A  False  False  False
B   True  False  False
C  False  False  False
</code></pre>
<p><strong>멀티 인덱스의 사용 (level인수)</strong></p>
<p>먼저 간단한 멀티인덱스 데이터프레임을 하나 만들어보겠습니다.</p>
<pre><code class="language-python">row_mul = [[&#39;U&#39;,&#39;U&#39;,&#39;U&#39;,&#39;D&#39;,&#39;D&#39;,&#39;D&#39;],[&#39;A&#39;,&#39;B&#39;,&#39;C&#39;,&#39;A&#39;,&#39;B&#39;,&#39;C&#39;]]
df_mul = pd.DataFrame(data=[[10,20,10],
                            [80,30,60],
                            [20,10,70],
                            [30,70,60],
                            [10,90,40],
                            [50,30,80]],index=row_mul,columns=col)
print(df_mul)
&gt;&gt;
     col1  col2  col3
U A    10    20    10
  B    80    30    60
  C    20    10    70
D A    30    70    60
  B    10    90    40
  C    50    30    80
</code></pre>
<p>이제 여기서 레벨을 선택하여 df와의 비교에 사용해 보겠습니다.</p>
<pre><code class="language-python">Copyprint(df.ge(df_mul,level=1)) # level=1이기 때문에 A, B, C를 index로하는 두 DataFrame과의 비교처럼
                             # 진행됩니다.
&gt;&gt;
      col1   col2   col3
U A   True   True   True
  B   True   True   True
  C   True   True   True
D A  False  False  False
  B   True  False   True
  C  False  False  False</code></pre>
<h2 id="dtype기반-열-선택-select_dtyps"><strong>dtype기반 열 선택 (select_dtyps)</strong></h2>
<p>select_dtypes 함수는 열에 포함된 데이터들을 type 기준으로 인덱싱 할 수 있도록 합니다.</p>
<p>select_dtypes(include=None, exclude=None) 형태를 가지며, include에 넣은값을 포함하고</p>
<p>exclude에 넣은 값을 제외한 columns(열)을 DaraFrame 형태로 반환합니다.</p>
<pre><code class="language-python">
col1 = [1, 2, 3, 4, 5]
col2 = [&#39;one&#39;, &#39;two&#39;, &#39;three&#39;, &#39;four&#39;, &#39;five&#39;]
col3 = [1.5, 2.5, 3.5, 4.5, 5.5]
col4 = [True, False, False, True, True]
df = pd.DataFrame({&quot;col1&quot;: col1, &quot;col2&quot;: col2, &quot;col3&quot;: col3, &quot;col4&quot;: col4})
print(df)

print(df.dtypes)

&gt;&gt;
   col1   col2  col3   col4
0     1    one   1.5   True
1     2    two   2.5  False
2     3  three   3.5  False
3     4   four   4.5   True
4     5   five   5.5   True
col1      int64
col2     object
col3    float64
col4       bool
dtype: object</code></pre>
<p><strong>include사용</strong></p>
<p>include에 포함될 type을 입력함으로써, 해당 type인 열만 반환하는것이 가능합니다.</p>
<pre><code class="language-python">result = df.select_dtypes(include=[float,bool])
print(result)
&gt;&gt;
   col3   col4
0   1.5   True
1   2.5  False
2   3.5  False
3   4.5   True
4   5.5   True
</code></pre>
<p><strong>exclude사용</strong></p>
<p>exclude에 제외할 type을 입력함으로써, 해당 type인 열만 제외하여 반환하는것이 가능합니다.</p>
<pre><code class="language-python">result = df.select_dtypes(exclude=[&#39;int64&#39;])
print(result)
&gt;&gt;
    col2  col3   col4
0    one   1.5   True
1    two   2.5  False
2  three   3.5  False
3   four   4.5   True
4   five   5.5   True
</code></pre>
<ul>
<li>include &amp; exclude 혼합 사용**</li>
</ul>
<p>include에 포함될 type을, exclude에 제외할 type을 입력하여 혼용 인덱싱이 가능합니다.</p>
<pre><code class="language-python">Copyresult = df.select_dtypes(include =[float,object], exclude=[&#39;int64&#39;])
print(result)
&gt;&gt;
    col2  col3
0    one   1.5
1    two   2.5
2  three   3.5
3   four   4.5
4   five   5.5</code></pre>
<h2 id="임계값-적용-clip"><strong>임계값 적용 (clip)</strong></h2>
<p><code>lower</code> : 하한값입니다. 이 이하의 값은 이 값으로 변경됩니다.</p>
<p><code>upper</code> : 상한값입니다. 이 이상의 값은 이 값으로 변경됩니다.</p>
<p><code>axis</code> : 계산할 기준이되는 레이블입니다.</p>
<p><code>inplace</code> : 제자리에서 계산할지 여부 입니다.</p>
<blockquote>
<p>inplace의 개념은 간단합니다. 우리가 만약 print(df.dropna())로 df에서 NA를 제거한다고 가정해봅니다.</p>
<p>그럼 <code>NA</code>가 사라진 데이터가 출력되겠지만, 다시 <code>print(df)</code>할 경우 df는 변경되어있지 않을 것입니다.</p>
<p>이때 <code>print(df.dropna(inplace=True))</code>를 수행한다면 <code>print(df)</code> 실행 시 df에도 <code>NA</code>가 삭제되어있는것을</p>
<p>확인할 수 있습니다. 물론 <code>dropna</code>뿐만 아니라 <code>clip</code>처럼 <code>inplace</code> 인수를 가진 모든 함수에서 동일합니다.</p>
<p>즉, <code>df.dropna(inplace=True)</code>는 <code>df = df.dropna( )</code>와 같은 효과를 가집니다.</p>
</blockquote>
<pre><code class="language-python">col  = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
row  = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
data = [[-7,3,9],
        [6,-8,1],
        [-3,0,-7]]


df = pd.DataFrame(data,row,col)
print(df)
&gt;&gt;
      col1  col2  col3
row1    -7     3     9
row2     6    -8     1
row3    -3     0    -7
</code></pre>
<hr>
<p><strong>일반적인 사용법</strong></p>
<p>하한선을 -4로 상한선을 5로 clip메서드를 적용시켜보겠습니다.</p>
<p>즉, -4보다 작은수는 -4로. 5보다 큰 수 는 5로 변경되며 그 안의 수는 변경되지 않습니다.</p>
<pre><code class="language-python">print(df.clip(-4,5))#초과하는 모든 값을 정해진 값으로 변경한다
&gt;&gt;
      col1  col2  col3
row1    -4     3     5 #-7이 -4로 변경, 9가 5로 변경
row2     5    -4     1 # 6이 5로 변경 -8이 -4로 변겅
row3    -3     0    -4 # -7이 -4로 변경
</code></pre>
<ul>
<li><ul>
<li>임계값을 Series로 설정**</li>
</ul>
</li>
</ul>
<p>임계값을 Series형태로 설정하여 각행이나 열마다 원하는 임계값의 지정이 가능합니다.</p>
<p><code>row1</code>에는 -1<del>1, <code>row2</code>에는 -2</del>2, <code>row3</code>에는 -3~3으로 임계값을 지정해보겠습니다.</p>
<p>먼저 Series인 <code>s</code>를 설정해보겠습니다.</p>
<pre><code class="language-python">s = pd.Series(data=[1,2,3],index=row)
print(s)
&gt;&gt;
row1    1
row2    2
row3    3
dtype: int64
</code></pre>
<p>이제 임계값을 <code>-s</code> 와 <code>s</code>로 설정하여 clip메서드를 적용해보겠습니다.</p>
<pre><code class="language-python">Copyprint(df.clip(-s,s,axis=0))#행을 기준으로 모든 값이 변경된다
&gt;&gt;
      col1  col2  col3
row1    -1     1     1 # -1~1 으로 변경
row2     2    -2     1 # -2~2 로 변경
row3    -3     0    -3 # -3~3 으로 변경</code></pre>
<h2 id="레이블-필터링-filter"><strong>레이블 필터링 (filter)</strong></h2>
<p>filter 메서드는 레이블에 대해서 조건에 맞는 레이블만 필터링하는 메서드입니다.</p>
<p>내용물이 아니라 레이블에 대해서만 필터링하는것을 유의하세요.</p>
<p>특정 레이블을 <code>이름</code>으로 필터링하거나, 포함된 <code>문자열</code>을 통해 필터링하거나, <code>정규표현식</code>으로 필터링이 가능합니다.</p>
<p><code>정규표현식(regular expression)</code>의 경우 <code>regex</code>라고도 하며 파이썬에서는 <code>re</code> 메서드가 지원하는 내용과 동일합니다.</p>
<p>※ 정규표현식의경우 웹상에 자료가 방대하므로 이 페이지에서는 설명하지 않겠습니다. 추후 별도 페이지로 생성 예정입니다.</p>
<p>df.filter(items=None, like=None, regex=None, axis=None)</p>
<p><code>items</code> : 이름으로 필터링하는 경우입니다. 리스트형태로 입력합니다.</p>
<p><code>like</code> : <code>str</code>로 필터링합니다. 해당 문자열이 포함된 경우를 반환합니다.</p>
<p><code>regex</code> : 정규표현식을 이용해 필터링합니다. <code>re.search(regex, label) == True</code>에서 사용되는 경우와 동일합니다.</p>
<p><code>axis</code> : {0 : index / 1 : columns} 필터링할 레이블입니다. 0은 행, 1은 열 입니다.</p>
<p>먼저 간단한 3x5짜리 데이터를 만들어보겠습니다.</p>
<pre><code class="language-python">col  = [&#39;alpha&#39;,&#39;beta&#39;,&#39;gamma&#39;,&#39;delta&#39;,&#39;epsilon&#39;]
row  = [&#39;sigma&#39;,&#39;omega&#39;,&#39;lambda&#39;]
data = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]
df = pd.DataFrame(data,row,col)
print(df)
&gt;&gt;
        alpha  beta  gamma  delta  epsilon
sigma       1     2      3      4        5
omega       6     7      8      9       10
lambda     11    12     13     14       15
</code></pre>
<hr>
<p><strong>items 인수를 사용하는 경우</strong></p>
<p><code>items</code>인수를 통해 <code>alpha</code>, <code>beta</code> 열을 필터링 해보겠습니다.</p>
<pre><code class="language-python">print(df.filter(items=[&#39;alpha&#39;,&#39;delta&#39;]))#알파와 델타만을 출력한다
&gt;&gt;
        alpha  delta
sigma       1      4
omega       6      9
lambda     11     14
</code></pre>
<p><code>omega</code>행을 필터링해보겠습니다.</p>
<pre><code class="language-python">print(df.filter(items=[&#39;omega&#39;],axis=0))#오메가를 행으로 출력한다
&gt;&gt;
       alpha  beta  gamma  delta  epsilon
omega      6     7      8      9       10
</code></pre>
<ul>
<li><ul>
<li>like 인수를 사용하는 경우**</li>
</ul>
</li>
</ul>
<p><code>like</code>인수를 이용해 &#39;ta&#39;가 포함된 열을 필터링해보겠습니다.</p>
<pre><code class="language-python">print(df.filter(like=&#39;ta&#39;))#ta가 포함된걸 출력한다
&gt;&gt;
        beta  delta
sigma      2      4
omega      7      9
lambda    12     14
</code></pre>
<ul>
<li><ul>
<li>regex 인수를 사용하는 경우**</li>
</ul>
</li>
</ul>
<p><code>regex</code>인수를 사용해서 m과 n이 포함된 열을 필터링 해보겠습니다.</p>
<blockquote>
<p>정규표현식 [ ] 는 [ ] 안의 모든 문자가 포함된 경우를 말합니다.</p>
<p>즉, <code>[mn]</code>은<code>m</code>과 <code>n</code>이 포함된 경우입니다.</p>
</blockquote>
<pre><code class="language-python">print(df.filter(regex=&#39;[mn]&#39;))#m이나n이 포함된 모든걸 출력한다
&gt;&gt;
        gamma  epsilon
sigma       3        5
omega       8       10
lambda     13       15
</code></pre>
<p>g로 시작하는 경우에 대해 필터링 해보겠습니다.</p>
<blockquote>
<p>정규표현식 ^는 ^뒤에있는 문자로 시작하는 문자열을 말합니다.</p>
<p>즉, <code>^g</code>는 <code>g</code>로 시작하는 경우를 말합니다.</p>
</blockquote>
<pre><code class="language-python">print(df.filter(regex=&#39;^g&#39;))#g로 시작하는 걸 출력한다
&gt;&gt;
        gamma
sigma       3
omega       8
lambda     13
</code></pre>
<p>a로 끝나는 경우에 대해 필터링 해보겠습니다.</p>
<blockquote>
<p>정규표현식 $는 $앞에있는 문자로 끝나는 문자열을 말합니다.</p>
<p>즉, <code>a$</code>는 <code>a</code>로 끝나는 경우를 말합니다.</p>
</blockquote>
<pre><code class="language-python">print(df.filter(regex=&#39;a$&#39;))# a로 끝나는 걸 모두 출력한다
&gt;&gt;
        alpha  beta  gamma  delta
sigma       1     2      3      4
omega       6     7      8      9
lambda     11    12     13     14
</code></pre>
<h2 id="샘플-추출-sample"><strong>샘플 추출 (sample)</strong></h2>
<p>sample 메서드는 DataFrame이나 Series에서 무작위로 몇개의 값(레이블)을 출력하는 메서드입니다.</p>
<p><code>n</code> : 추출할 갯수 입니다. <code>replace</code>가 False면 <code>n</code>의 최댓값은 레이블의 갯수를 넘을수 없습니다.
<code>frac</code> : 추출할 비율입니다. 1보다 작은값으로 설정하며(예 : 0.3 이면 30%), <code>n</code>과 동시에 사용할 수 없습니다.</p>
<p><code>replace</code> : 중복추출의 허용 여부 입니다. <code>True</code>로 하면 중복추출이 가능하며 <code>n</code>의 최댓값이 레이블의 갯수보다 커도 됩니다.
<code>weight</code> : 가중치입니다. 즉 레이블마다 추출될 확률을 지정할 수 있습니다. 합계가 1(100%)이 아닐경우 자동으로 1로 연산합니다.
<code>random_state</code> : 랜덤 추출한 값에 시드를 설정할 수 있습니다. 원하는 값을 설정하면, 항상 같은 결과를 출력합니다.
<code>ignore_index</code> : index의 무시 여부입니다. <code>True</code>일경우 출력시 index를 무시하고 숫자로 출력합니다.
<code>axis</code> : {0 : index / 1 : columns} 추출할 레이블입니다.</p>
<pre><code class="language-python">col  = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;]
row  = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;,&#39;row5&#39;]
data = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]]
df = pd.DataFrame(data,row,col)
print(df)
&gt;&gt;
      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9
row4    10    11    12
row5    13    14    15
</code></pre>
<hr>
<p><strong>n의 사용과 replcae의 사용</strong></p>
<p><code>n</code>을 설정함으로써 원하는 갯수의 추출이 가능합니다. <code>n</code>을 2로 설정함으로써 2개의 행이 추출된것을 볼 수 있습니다.</p>
<pre><code class="language-python">print(df.sample(2))
&gt;&gt;
      col1  col2  col3
row3     7     8     9
row4    10    11    12
</code></pre>
<p>행이 5이지만 <code>replace=True</code>로 설정하여 중복 추출을 허용한다면, n이 5보다 커도 됩니다.</p>
<pre><code class="language-python">print(df.sample(10,replace=True))
&gt;&gt;
      col1  col2  col3
row2     4     5     6
row4    10    11    12
row5    13    14    15
row5    13    14    15
row5    13    14    15
row1     1     2     3
row5    13    14    15
row2     4     5     6
row1     1     2     3
row1     1     2     3
</code></pre>
<p><strong>frac를 사용하는경우</strong></p>
<p><code>frac</code>을 통해 전체에대한 추출 비율을 정할 수 있습니다. <code>frac</code>을 0.4로 설정하므로써, 전체에서 40%인 2개를 추출해보겠습니다.</p>
<pre><code class="language-python"> print(df.sample(frac=0.4))
 &gt;&gt;
      col1  col2  col3
row2     4     5     6
row5    13    14    15
</code></pre>
<p><strong>weights를 통한 가중치의 사용</strong></p>
<p>먼저 가중치를 적용하기위해 5짜리 Series를 하나 만들어보겠습니다.</p>
<pre><code class="language-python">s = pd.Series(data=[10,10,3,3,1],index=row)
print(s)
&gt;&gt;
row1    10
row2    10
row3     3
row4     3
row5     1
dtype: int64
</code></pre>
<p>이제 이 Series <code>s</code>를 <code>weights</code>에 적용시켜보겠습니다. 가장 가중치가 높은 <code>row1</code>, <code>row2</code>가 추출된 것을 확인할 수 있습니다.</p>
<p>물론 가중치가 적더라도 확률적으로 추출될 가능성이 존재합니다.</p>
<pre><code class="language-python">print(df.sample(2,weights=s))
&gt;&gt;
      col1  col2  col3
row3     7     8     9
row2     4     5     6
</code></pre>
<p><strong>random_state를 통한 동일값 재출력 허용</strong></p>
<p><code>random_state</code>에 원하는 값을 설정하므로써 출력 결과를 동일하게 다시 출력하는것이 가능합니다.</p>
<pre><code class="language-python">print(df.sample(5,random_state=7))
&gt;&gt;
      col1  col2  col3
row1     1     2     3
row4    10    11    12
row3     7     8     9
row2     4     5     6
row5    13    14    15
</code></pre>
<p>위 과정을 통해 <code>row1</code>, <code>row2</code>, <code>row3</code>, <code>row4</code>, <code>row5</code>가 출력되고 <code>random_state</code>에 7을 부여했습니다.</p>
<p>동일한 내용으로 다시 출력하면 같은 값이 아래와 같이 재현됨을 알 수 있습니다.</p>
<pre><code class="language-python">print(df.sample(5,random_state=7))
&gt;&gt;
      col1  col2  col3
row1     1     2     3
row4    10    11    12
row3     7     8     9
row2     4     5     6
row5    13    14    15
</code></pre>
<p><strong>ignore_index의 사용</strong></p>
<p><code>ignore_index</code>를 <code>True</code>로 하면 index는 사라지고 순서대로 번호가 부여됩니다.</p>
<pre><code class="language-python">print(df.sample(3,ignore_index=True))
&gt;&gt;
   col1  col2  col3
0     7     8     9
1     4     5     6
2    10    11    12</code></pre>
<h2 id="결측값-확인-isna-isnull-notna-notnull"><strong>결측값 확인 (isna, isnull, notna, notnull)</strong></h2>
<h3 id="dataframeisna--isnull-과-완전히-동일합니다"><strong>DataFrame.isna( )※ <code>isnull( )</code>과 완전히 동일합니다.</strong></h3>
<h3 id="dataframenotna--notnull-과-완전히-동일합니다"><strong>DataFrame.notna( )※ <code>notnull( )</code>과 완전히 동일합니다.</strong></h3>
<h2 id="개요"><strong>개요</strong></h2>
<p><code>isna</code> 메서드와 <code>notna</code> 메서드는 DataFrame내의 결측값을 확인해서 <code>bool</code>형식으로 반환하는 메서드입니다.</p>
<p><code>isna</code>의 경우 결측값이면 <code>True</code> 반환, 정상값이면 <code>False</code>반환이며,</p>
<p><code>notna</code>의 경우 결측값이면<code>False</code>반환, 정상값이면 <code>True</code>를 반환합니다.</p>
<p>먼저 다양한 결측값이 포함된 간단한 4x4짜리 데이터를 만들어보겠습니다.</p>
<pre><code class="language-python">col  = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;]
row  = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;]
data = [[1,2,pd.NA,4],
        [np.nan,6,7,8],
        [9,10,11,None]]
df = pd.DataFrame(data,row,col)
&gt;&gt;
      col1  col2  col3  col4
row1   1.0     2  &lt;NA&gt;   4.0
row2   NaN     6     7   8.0
row3   9.0    10    11   NaN
</code></pre>
<hr>
<p><strong>isna / isnull의 사용</strong></p>
<p><code>isna</code>나 <code>isnull</code>의 경우 결측값이면 <code>True</code>를 반환합니다.</p>
<pre><code class="language-python">print(df.isna())
&gt;&gt;
           col1   col2   col3   col4 #isna기 때문에 결측값이 true로 출력함
row1  False  False   True  False
row2   True  False  False  False
row3  False  False  False   True
</code></pre>
<p><strong>notna / notnull의 사용</strong></p>
<p><code>notna</code>나 <code>notnull</code>의 경우 결측값이면 <code>False</code>를 반환합니다.</p>
<pre><code class="language-python">Copyprint(df.notna())#notna는 isna의 반대로 출력한다
&gt;&gt;
       col1  col2   col3   col4
row1   True  True  False   True
row2  False  True   True   True
row3   True  True   True  False</code></pre>
<h2 id="결측값-제거-dropna"><strong>결측값 제거 (dropna)</strong></h2>
<p>df.dropna(axis=0, how=&#39;any&#39;, thresh=None, subset=None, inplace=False)</p>
<p><code>axis</code> : {0: index / 1: columns} 결측치 제거를 진행 할 레이블입니다.</p>
<p><code>how</code> : {&#39;any&#39; : 존재하면 제거 / &#39;all&#39; : 모두 결측치면 제거} 제거할 유형입니다. 포함만 시켜도 제거할지, 전무 <code>NA</code>여야 제거할지 정할 수 있습니다.</p>
<p><code>tresh</code> : 결측값이 아닌 값이 몇 개 미만일 경우에만 적용시키는 인수 입니다.</p>
<p>예를들어, <code>tresh</code>값이 3이라면 결측값이 아닌 값이 3개 미만일 경우에만 <code>dropna</code>메서드를 수행합니다.</p>
<p><code>subset</code> : <code>dropna</code>메서드를 수행할 레이블을 지정합니다.</p>
<p><code>inplace</code> : 원본을 변경할지의 여부입니다.</p>
<h2 id="예시"><strong>예시</strong></h2>
<p>먼저 <code>pd.NA</code>가 포함된 간단한 4x5짜리 데이터를 만들어보겠습니다.</p>
<pre><code class="language-python">col  = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;,&#39;col5&#39;]
row  = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;]
data = [[1,2,3,pd.NA,5],[6,pd.NA,8,pd.NA,10],[11,12,13,14,15],[pd.NA,pd.NA,pd.NA,pd.NA,pd.NA]]
df = pd.DataFrame(data,row,col)
print(df)
&gt;&gt;
      col1  col2  col3  col4  col5
row1     1     2     3  &lt;NA&gt;     5
row2     6  &lt;NA&gt;     8  &lt;NA&gt;    10
row3    11    12    13    14    15
row4  &lt;NA&gt;  &lt;NA&gt;  &lt;NA&gt;  &lt;NA&gt;  &lt;NA&gt;
</code></pre>
<hr>
<p><strong>axis값에 따른 결측치 제거 수행</strong></p>
<p><code>axis</code>가 0인경우 행에 대해서, <code>axis</code>가 1인경우 열에 대해서 결측치 제거가 수행됩니다.</p>
<p><code>axis</code>=0인 경우 결측치가 포함된 모든 행이 제거되었습니다.</p>
<pre><code class="language-python">print(df.dropna(axis=0))#결측치 포함 모든 행 제거
&gt;&gt;
     col1 col2 col3 col4 col5
row3   11   12   13   14   15
</code></pre>
<p><code>axis</code>=1인 경우 결측치가 포함된 모든 열이 제거되었습니다. 예시의 경우 모든 열에 <code>NA</code>가 존재하므로 빈 값이 반환됩니다.</p>
<pre><code class="language-python">print(df.dropna(axis=1))#결측치 포함 모든 열 제거
&gt;&gt;
Empty DataFrame
Columns: []
Index: [row1, row2, row3, row4]
</code></pre>
<p><strong>how로 연산기준을 정할 경우</strong></p>
<p>기본적으로 <code>how</code> 는 &#39;any&#39;이며 이 경우 한 값이라도 <code>NA</code>를 가진다면 해당 레이블을 제거합니다.</p>
<pre><code class="language-python">print(df.dropna(how=&#39;any&#39;))
&gt;&gt;
     col1 col2 col3 col4 col5
row3   11   12   13   14   15
</code></pre>
<p><code>how</code>를 &#39;all&#39;로 할 경우 모든값이 <code>NA</code>인 레이블만 삭제됩니다.</p>
<pre><code class="language-python">print(df.dropna(how=&#39;all&#39;))
&gt;&gt;
     col1  col2 col3  col4 col5
row1    1     2    3  &lt;NA&gt;    5
row2    6  &lt;NA&gt;    8  &lt;NA&gt;   10
row3   11    12   13    14   15
</code></pre>
<p><strong>thresh 를 이용하는 경우</strong></p>
<p><code>thresh</code>를 이용하여 정상값의 수를 보장할 수 있습니다.</p>
<p><code>thresh</code>가 3일 경우 정상값이 3개 미만인 경우에 대해서만 결측치 보정을 진행합니다.</p>
<pre><code class="language-python">print(df.dropna(thresh=3))
&gt;&gt;
     col1  col2 col3  col4 col5
row1    1     2    3  &lt;NA&gt;    5
row2    6  &lt;NA&gt;    8  &lt;NA&gt;   10
row3   11    12   13    14   15
</code></pre>
<p><code>thresh</code>가 4인 경우 정상값이 4개 미만인 경우에 대해서 결측치 보정을 진행합니다.</p>
<pre><code class="language-python">print(df.dropna(thresh=4))
&gt;&gt;
     col1 col2 col3  col4 col5
row1    1    2    3  &lt;NA&gt;    5
row3   11   12   13    14   15
</code></pre>
<p><strong>subset 인수를 통한 레이블 지정</strong></p>
<p><code>subset</code>에 리스트형태의 값을 입력함으로써 결측치 제거를 수행할 레이블을 지정할 수 있습니다.</p>
<p><code>col1</code>, <code>col2</code>에 대해서 결측치가 있는경우만 제거되었습니다.</p>
<pre><code class="language-python">print(df.dropna(subset=[&#39;col1&#39;,&#39;col2&#39;]))
&gt;&gt;
     col1 col2 col3  col4 col5
row1    1    2    3  &lt;NA&gt;    5
row3   11   12   13    14   15
</code></pre>
<p><strong>inplcae 인수를 통한 원본의 수정</strong></p>
<p>Pandas에서 공통적으로 <code>inplace</code> 인수는 원본의 수정을 의미합니다. <code>inplace</code>가 True인 경우 원본이 수정됩니다.</p>
<pre><code class="language-python">df.dropna(inplace=True)
print(df)
&gt;&gt;
     col1 col2 col3 col4 col5    #원본에 대해서도 결측치 제거가 수행됨.
row3   11   12   13   14   15</code></pre>
<h2 id="결측값-없는-인덱스-확인-first_valid_index--last_valid_index"><strong>결측값 없는 인덱스 확인 (first_valid_index / last_valid_index)</strong></h2>
<p><code>first_valid_index</code>메서드의 경우 처음으로 결측치가 아닌값이 나오는 행의 인덱스를 출력합니다.
<code>last_valid_index</code>메서드의 경우 마지막으로 결측치가 아닌값이 나오는 행의 인덱스를 출력합니다.
즉, 결측값만 있는 행은 무시한다고 생각하면 됩니다.</p>
<p>먼저 다양한 결측값이 포함된 간단한 5x2짜리 데이터를 만들어보겠습니다.</p>
<pre><code class="language-python">col  = [&#39;col1&#39;,&#39;col2&#39;]
row  = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;,&#39;row5&#39;]
data = [[np.nan,np.nan],[pd.NA,4],[pd.NA,pd.NaT],[5,6],[np.nan,pd.NA]]
df = pd.DataFrame(data,row,col)
print(df)
&gt;&gt;
      col1  col2
row1   NaN   NaN
row2  &lt;NA&gt;     4
row3  &lt;NA&gt;   NaT
row4     5     6
row5   NaN  &lt;NA&gt;
</code></pre>
<hr>
<p><strong>first_valid_index의 사용</strong></p>
<p><code>first_valid_index</code>메서드의 경우 처음으로 결측치가 아닌값이 나오는 행의 인덱스를 출력합니다.</p>
<p>이 경우 <code>row2</code>에서 처음으로 정상값인 <code>4</code>가 있으므로 <code>row2</code>를 출력합니다.</p>
<pre><code class="language-python">print(df.first_valid_index())
&gt;&gt;
row2
</code></pre>
<p><strong>last_valid_index의 사용</strong></p>
<p><code>last_valid_index</code>메서드의 경우 마지막으로 결측치가 아닌값이 나오는 행의 인덱스를 출력합니다.</p>
<p>이 경우 <code>row4</code>이후에는 정상값이 없으므로 <code>row4</code>를 출력합니다.</p>
<pre><code class="language-python">Copyprint(df.last_valid_index())
&gt;&gt;
row4</code></pre>
<h2 id="결측값-변경-fillna--backfill--bfill--pad--ffill"><strong>결측값 변경 (fillna / backfill / bfill / pad / ffill)</strong></h2>
<p><code>fillna</code> 메서드는 DataFrame에서 결측값을 원하는 값으로 변경하는 메서드입니다.</p>
<p><code>value</code> : 결측값을 대체할 값입니다. dict형태로도 가능합니다.</p>
<p><code>method</code> : 결측값을 변경할 방식입니다. <code>bfill</code>로 할경우 결측값을 바로 아래 값과 동일하게 변경합니다.</p>
<p><code>ffill</code>로 할 경우 결측값을 바로 위 값과 동일하게 변경합니다.</p>
<p><code>axis</code> : {0 : index / 1 : columns} <code>fillna</code> 메서드를 적용할 레이블입니다.</p>
<p><code>inplace</code> : 원본을 변경할지 여부입니다. <code>True</code>일 경우 원본을 변경하게 됩니다.</p>
<p><code>limit</code> : 결측값을 변경할 횟수입니다. 위에서부터 <code>limit</code>로 지정된 갯수만큼만 변경합니다.</p>
<p><code>downcast</code> : 다운캐스트할지 여부입니다. <code>downcast</code>=&#39;infer&#39;일 경우 <code>float64</code>를 <code>int64</code>로 변경합니다.</p>
<pre><code class="language-python">col  = [&#39;col1&#39;,&#39;col2&#39;,&#39;col3&#39;,&#39;col4&#39;,&#39;col5&#39;]
row  = [&#39;row1&#39;,&#39;row2&#39;,&#39;row3&#39;,&#39;row4&#39;,&#39;row5&#39;]
na = np.nan
data = [[na, 2,na, 4,na],
        [ 6, 7,na, 9,na],
        [11,na,na,14,15],
        [na,17,na,na,20],
        [na,22,na,na,25]]
df = pd.DataFrame(data,row,col)
print(df)
&gt;&gt;
      col1  col2  col3  col4  col5
row1   NaN   2.0   NaN   4.0   NaN
row2   6.0   7.0   NaN   9.0   NaN
row3  11.0   NaN   NaN  14.0  15.0
row4   NaN  17.0   NaN   NaN  20.0
row5   NaN  22.0   NaN   NaN  25.0
</code></pre>
<hr>
<p><strong>value의 형식에 따른 사용</strong></p>
<p><code>value</code>가 숫자나 문자일 경우 그대로 결측값을 대체하게 됩니다. 여기서는 A로 바꿔보겠습니다.</p>
<pre><code class="language-python">print(df.fillna(&#39;A&#39;))
&gt;&gt;
      col1  col2 col3  col4  col5
row1     A   2.0    A   4.0     A
row2   6.0   7.0    A   9.0     A
row3  11.0     A    A  14.0  15.0
row4     A  17.0    A     A  20.0
row5     A  22.0    A     A  25.0
</code></pre>
<p><code>dict</code>형태로 입력할 경우 각각 레이블값에 대해 원하는 값으로의 변경이 가능합니다.</p>
<pre><code class="language-python">dict = {&#39;col1&#39;:&#39;A&#39;,&#39;col2&#39;:&#39;B&#39;,&#39;col3&#39;:&#39;C&#39;,&#39;col4&#39;:&#39;D&#39;,&#39;col5&#39;:&#39;E&#39;}
print(df.fillna(value=dict))
&gt;&gt;
      col1  col2 col3  col4  col5
row1     A   2.0    C   4.0     E
row2   6.0   7.0    C   9.0     E
row3  11.0     B    C  14.0  15.0
row4     A  17.0    C     D  20.0
row5     A  22.0    C     D  25.0
</code></pre>
<p><strong>method인수를 사용하는 경우</strong></p>
<p><code>method</code>인수에 <code>bfill</code>을 입력할 경우 결측값이 바로 아래값과 동일하게 설정됩니다.</p>
<p>※ <code>df.backfill( )</code>이나 <code>df.bfill( )</code>과 완전히 동일한 기능을 수행합니다.</p>
<pre><code class="language-python">print(df.fillna(method=&#39;bfill&#39;))
&gt;&gt;
      col1  col2  col3  col4  col5
row1   6.0   2.0   NaN   4.0  15.0
row2   6.0   7.0   NaN   9.0  15.0
row3  11.0  17.0   NaN  14.0  15.0
row4   NaN  17.0   NaN   NaN  20.0
row5   NaN  22.0   NaN   NaN  25.0
</code></pre>
<p><code>method</code>인수에 <code>ffill</code>을 입력할 경우 결측값이 바로 위값과 동일하게 설정됩니다.</p>
<p>※ <code>df.pad( )</code>나 <code>df.ffill( )</code>과 완전히 동일한 기능을 수행합니다.</p>
<pre><code class="language-python">print(df.fillna(method=&#39;ffill&#39;))
&gt;&gt;
      col1  col2  col3  col4  col5
row1   NaN   2.0   NaN   4.0   NaN
row2   6.0   7.0   NaN   9.0   NaN
row3  11.0   7.0   NaN  14.0  15.0
row4  11.0  17.0   NaN  14.0  20.0
row5  11.0  22.0   NaN  14.0  25.0
</code></pre>
<p><strong>limit인수를 사용하는 경우</strong></p>
<p><code>limit</code>인수는 각 레이블값에 대해서 결측치 변경을 수행할 횟수입니다. 행 기준일경우 왼쪽부터, 열 기준일 경우 위에서부터 수행합니다.</p>
<pre><code class="language-python">print(df.fillna(&#39;A&#39;, limit=2))
&gt;&gt;
      col1  col2 col3  col4  col5
row1     A   2.0    A   4.0     A
row2   6.0   7.0    A   9.0     A
row3  11.0     A  NaN  14.0  15.0
row4     A  17.0  NaN     A  20.0
row5   NaN  22.0  NaN     A  25.0
</code></pre>
<p><strong>downcast인수를 사용하는 경우</strong></p>
<p><code>downcast</code> 인수를 &#39;infer&#39;로 설정함으로써 <code>float64</code>형태를 <code>int64</code>형태로 변경할 수 있습니다.</p>
<pre><code class="language-python">print(df.fillna(0, downcast=&#39;infer&#39;))
&gt;&gt;
      col1  col2  col3  col4  col5
row1     0     2     0     4     0
row2     6     7     0     9     0
row3    11     0     0    14    15
row4     0    17     0     0    20
row5     0    22     0     0    25
</code></pre>
<p><strong>inplace를 사용하는 경우</strong></p>
<p>다른 파이썬 객체에서와 마찬가지로 <code>inplace</code>는 원본을 덮어씌우는 기능과 유사한 기능알 합니다.</p>
<p>즉 <code>df.fillna(0, inplace=True)</code> 는 <code>df=df.fillna(0)</code>과 동일한 기능을 합니다.</p>
<pre><code class="language-python">df.fillna(&#39;A&#39;,inplace=True)
print(df)
&gt;&gt;
      col1  col2 col3  col4  col5
row1     A   2.0    A   4.0     A
row2   6.0   7.0    A   9.0     A
row3  11.0     A    A  14.0  15.0
row4     A  17.0    A     A  20.0
row5     A  22.0    A     A  25.0
</code></pre>
<h2 id="결측값-없는-마지막-행-반환-asof"><strong>결측값 없는 마지막 행 반환 (asof)</strong></h2>
<p><code>asof</code> 메서드는 인덱스 기준으로 <code>where</code>이전에 결측치가 없는 마지막 행을 구합니다.</p>
<p><strong>기본 사용법</strong></p>
<p>df.asof(where, subset=None)</p>
<p><code>where</code> : 기준이 되는 인덱스 값입니다.</p>
<p><code>subset</code> : 기준이 되는 열 입니다.</p>
<p>먼저 결측치가 포함된 6x2짜리 객체를 생성해보겠습니다..</p>
<pre><code class="language-python">row = [10,20,30,40,50,60]
data = {&#39;A&#39;:[1,n,n,4,5,6],&#39;B&#39;:[7,8,9,10,n,12]}
df = pd.DataFrame(data=data, index = row)
print(df)
&gt;&gt;
      A     B
10  1.0   7.0
20  NaN   8.0
30  NaN   9.0
40  4.0  10.0
50  5.0   NaN
60  6.0  12.0
</code></pre>
<hr>
<p><code>where</code>이 단일값이면 반환은 Series형태로 하게 됩니다. <code>subset</code>을 입력하지 않으면 모든 열에대해서 조건을 만족하는 경우를 반환합니다.</p>
<pre><code class="language-python">print(df.asof(where=45))
&gt;&gt;
A     4.0
B    10.0
Name: 45, dtype: float64
</code></pre>
<p>45이전에 <code>A</code>열과 <code>B</code>열 모두 결측치가 없는 행은 40입니다. Index가 40인 값을 출력하였습니다.</p>
<p><strong>입력값이 list인 경우</strong></p>
<p>입력값이 <code>list</code>인 경우 <code>list</code>의 각각 요소에 대해 조건을 만족하는 행을 DataFrame 형태로 반환합니다.</p>
<pre><code class="language-python">print(df.asof(where=[10,45,60]))
&gt;&gt;
      A     B
10  1.0   7.0
45  4.0  10.0
60  6.0  12.0
</code></pre>
<p>10이전에 <code>A</code>와 <code>B</code>모두 결측치가 없는 행은 10입니다.</p>
<p>45이전에 <code>A</code>와 <code>B</code>모두 결측치가 없는 행은 40입니다.</p>
<p>60이전에 <code>A</code>와 <code>B</code>모두 결측치가 없는 행은 60입니다.</p>
<p><strong>subset의 사용</strong></p>
<p><code>subset</code>을 이용해 특정 열에 대해서만 만족하는 경우를 반환할 수 있습니다.</p>
<p><code>A</code>에 대해서만 연산 할 경우</p>
<pre><code class="language-python">print(df.asof(where=[10,35,60],subset=&#39;A&#39;))
&gt;&gt;
      A     B
10  1.0   7.0
35  1.0   7.0
60  6.0  12.0
</code></pre>
<p>10이전에 <code>A</code>에 대해서 결측치가 없는 행은 10입니다.</p>
<p>35이전에 <code>A</code>에 대해서 결측치가 없는 행은 10입니다.</p>
<p>60이전에 <code>A</code>에 대해서 결측치가 없는 행은 60입니다.</p>
<p><code>B</code>에 대해서만 연산 할 경우</p>
<pre><code class="language-python">print(df.asof(where=[10,35,60],subset=&#39;B&#39;))
&gt;&gt;
      A     B
10  1.0   7.0
35  NaN   9.0
60  6.0  12.0
</code></pre>
<p>10이전에 <code>B</code>에 대해서 결측치가 없는 행은 10입니다.</p>
<p>35이전에 <code>B</code>에 대해서 결측치가 없는 행은 30입니다.</p>
<p>60이전에 <code>B</code>에 대해서 결측치가 없는 행은 60입니다.</p>
]]></description>
        </item>
    </channel>
</rss>