Python/데이터분석

Python Pandas 2

code2772 2023. 2. 17. 08:26
728x90
반응형

2. 데이터 기본 정보 알아보기

 
type(df)
 
pandas.core.frame.DataFrame
 

2-1. column(열)

 
df.columns
 
Index(['이름', '그룹', '소속사', '성별', '생년월일', '키', '혈액형', '브랜드평판지수'], dtype='object')
 
new_column = ['name','group','company','gender','birthday','height','blood','brand']
 
 
 
df.columns = new_column
df.columns
 
Index(['name', 'group', 'company', 'gender', 'birthday', 'height', 'blood',
       'brand'],
      dtype='object')
 
df
 
 

2-2. row(행)

 
 
df.index
 
RangeIndex(start=0, stop=15, step=1)
 
# 기본적인 행의 정보와 데이터타입을 확인
df.info()
 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 8 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   name      15 non-null     object 
 1   group     14 non-null     object 
 2   company   15 non-null     object 
 3   gender    15 non-null     object 
 4   birthday  15 non-null     object 
 5   height    13 non-null     float64
 6   blood     15 non-null     object 
 7   brand     15 non-null     int64  
dtypes: float64(1), int64(1), object(6)
memory usage: 1.1+ KB
 

2-3. 통계정보 알아보기


 
# 통계 정보를 확인: 기본값은 정수 또는 실수 컬럼만 확인
df.describe()
 
 
df.describe(include='all') # df.describe(include='object')
 
 
 

2-4. 형태(shpae) 알아보기

 
df.shape
 
(15, 8)
 

2-5. 원하는 개수의 데이터 보기

  • head(): 상위 5개의 row를 출력
  • head(n): 상위 n개의 row를 출력
  • tail(): 하위 5개의 row를 출력
  • tail(n): 하위 5개의 row를 출력
 

 
df.head(3)
 
 
 
 
df.tail()
 
 
 
df.tail(3)
 
 

2-6. 정렬하기

 
# 기본값은 index로 오름차순
 
 
 
# index로 내림차순 정렬
df.sort_index(ascending=False)
 
 
 
# 이름순으로 오름차순 정렬
df.sort_values(by='name')
 
 
# 이름순으로 내림차순 정렬
df.sort_values(by='name'ascending=False)
 
 
 
 
# 키순으로 내림차순 정렬, NaN을 가장 위로 올림
df.sort_values(by='name'ascending=False, na_position='first')
 
 
# 키순으로 오름차순 정렬 후 브랜드로 오름차순 정렬, NaN을 가장 위로 올림
df.sort_values(by=['height''brand'], na_position='first')
 
 
 
# 키순으로 내림차순 정렬 후 브랜드로 오름차순 정렬, NaN을 가장 위로 올림
df.sort_values(by=['height''brand'], ascending=[False, True],na_position='first')
 
 
 

3. 컬럼으로 데이터 다루기

 
 
df.head()
 
 
 
df['name']
 
0       지민
1     지드래곤
2     강다니엘
3        
4       화사
5       정국
6       민현
7       소연
8        
9      하성운
10      태연
11     차은우
12      백호
13      JR
14      슈가
Name: name, dtype: object
 
 
df.name
 
0       지민
1     지드래곤
2     강다니엘
3        
4       화사
5       정국
6       민현
7       소연
8        
9      하성운
10      태연
11     차은우
12      백호
13      JR
14      슈가
Name: name, dtype: object
 

3-1. 컬럼 범위 선택하기

 
df[:3] # df.head(3)
 
 
df.loc[:, 'name']
 
0       지민
1     지드래곤
2     강다니엘
3        
4       화사
5       정국
6       민현
7       소연
8        
9      하성운
10      태연
11     차은우
12      백호
13      JR
14      슈가
Name: name, dtype: object
 
 
df.loc[:3, 'name'] # index 3을 포함
 
0      지민
1    지드래곤
2    강다니엘
3       
Name: name, dtype: object
 
 
df.loc[:,['name''height']]
 
 
 
df.loc[3:8, ['name','height']]
 
 
 
df.loc[3:8, 'name':'height']
 
 
 
df.iloc[:,[0,2]]
 
 
 
df.iloc[:,0:2] # 0:2 -> index 2를 포함하지 않음
 
 
 
df.iloc[1:4,0:2]
 
 
 
df['height'] >= 180
 
0     False
1     False
2      True
3     False
4     False
5     False
6      True
7     False
8     False
9     False
10    False
11     True
12    False
13    False
14    False
Name: height, dtype: bool
 
 
df[df['height'] >= 180]['name']
 
2     강다니엘
6       민현
11     차은우
Name: name, dtype: object
 
 
df[df['height'] >= 180][['name','gender','height']]
 
 
df.loc[df['height'] >= 180, ['name','gender','height']]
 

3-3. isin 활용하기

  • isin은 조건을 걸고자 하는 값이 정의한 list에 있을 때만 색인하려는 경우에 사용
 
 
company = ['플레디스''SM']
 
 
 
df['company'].isin(company)
 
0     False
1     False
2     False
3     False
4     False
5     False
6      True
7     False
8     False
9     False
10     True
11    False
12     True
13     True
14    False
Name: company, dtype: bool
 
 
df.loc[df['company'].isin(company), :] # df.loc[df['company].isin(company)]
 
 
 
df.loc[df['company'].isin(company), ['name''company']]
 
 

4. 결측값(NaN)

  • NaN은 비어있는 값 또는 결측값이라고 부름
  • pandas에서는 null을 NaN(Not a Number)으로 표기됨
 
 
df.info()
 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 8 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   name      15 non-null     object 
 1   group     14 non-null     object 
 2   company   15 non-null     object 
 3   gender    15 non-null     object 
 4   birthday  15 non-null     object 
 5   height    13 non-null     float64
 6   blood     15 non-null     object 
 7   brand     15 non-null     int64  
dtypes: float64(1), int64(1), object(6)
memory usage: 1.1+ KB
 
 
 
# 결측값인지 아닌지 여부를 판단
df.isna()
 
 
 
# null인지 여부를 판단
df.isnull()
 
 
 
df['group'].isnull()
 
0     False
1     False
2      True
3     False
4     False
5     False
6     False
7     False
8     False
9     False
10    False
11    False
12    False
13    False
14    False
Name: group, dtype: bool
 
 
df[df['group'].isnull()]
 
 
 
df[df['group'].isnull()]['name']
 
2    강다니엘
Name: name, dtype: object
 
 
df['name'][df['group'].isnull()]
 
2    강다니엘
Name: name, dtype: object
 
 
df['name'][df['group'].notnull()]
 
0       지민
1     지드래곤
3        
4       화사
5       정국
6       민현
7       소연
8        
9      하성운
10      태연
11     차은우
12      백호
13      JR
14      슈가
Name: name, dtype: object
 
 
# 그룹이 있는 연예인의 이름, 키, 혈액형을 출력(단, loc을 사용)
df.loc[df['group'].notnull(), ['name','height','blood']]
 
 
new_df = df
 
 
 
new_df.head()
 
 
 
 
new_df['name'] = '김사과'
 
new_df.head()
 
 
 
df.head()
 
 
 
print(hex(id(new_df)))
print(hex(id(df)))
 
0x7fc0cf262490
0x7fc0cf262490
df = pd.read_csv('http://bit.ly/ds-korean-idol')
df
 
 
 
copy_df = df.copy()
 
 
 
print(hex(id(copy_df)))
print(hex(id(df)))
 
0x7fc0807163d0
0x7fc080716700
 
 
copy_df['이름'] = '김사과'
 
copy_df.head()
 
 
df.head()
 

6. row, column 추가 및 삭제하기

 

6-1. row 추가하기

  • dict 형태의 데이터를 만들어주고 append() 함수를 사용하여 데이터를 추가
  • 반드시 ignore_index=True 옵션을 추가해야 에러가 나지 않음

 

 
df.append({'이름':'김사과''그룹':'애플''소속사':'apple','성별':'여자''생년월일':'2000-01-01''키'160'혈액형':'A''브랜드평판지수'12345678}, ignore_index=True)
 
 
 
df = df.append({'이름':'김사과''그룹':'애플''소속사':'apple','성별':'여자''생년월일':'2000-01-01''키'160'혈액형':'A''브랜드평판지수'12345678}, ignore_index=True)
 
 
 
df.tail()
 

6-2. column 추가하기

 

 

df.head()
df['국적'] = '대한민국'
df.head()
 
 
 
df.loc[df['이름']=='김사과','국적'] = '미국'
 
df.tail()
 
 
 

7. 통계함수 다루기

 
df.describe()
 
df['키'].sum()
 
2445.3
 
df['키'].count() #NaN을 제외
 
14
 
 
df['키'].mean()
 
174.66428571428574
 
 
df['키'].max()
 
183.0
 
 
# 분산: 데이터가 평균으로부터 얼마나 떨어져 있는지 정도
# (데이터-평균)**2을 모두 합한 값/데이터의 개수
df['키'].var() # 분산
 
49.08708791208794
 
 
# 표준편차: 분산에 루트를 씌움
df['키'].std() # 표준편차
 
7.0062178036432705
 

 
import numpy as np
 
data = np.array([13579])
 
np.sqrt(((1-5)**2 + (3-5)**2 + (5-5)**2 + (7-5)**2 + (9-5)**2) / 5)
 
2.8284271247461903
 
 
data.std()
 
2.8284271247461903
 

8. 그룹으로 묶기

  • groupby는 데이터를 그룹으로 묶어 분석할 때 사용
 
 
df.head()
 
 
df.groupby('소속사')
 
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7fc0805b2c70>
 
 
df.groupby('소속사').count()
 
 
df.groupby('소속사').mean()
df.groupby('소속사').sum()
# 혈액형별로 그룹을 맺고, 키의 평균값을 확인
df.groupby('혈액형')['키'].mean()
 
혈액형
A     171.114286
AB    176.500000
B     183.000000
O     177.875000
Name: 키, dtype: float64
 
 
# 혈액형별로 그룹을 맺고 또 성별로 그룹을 나눈 후 키의 평균값을 확인
df.groupby(['혈액형','성별'])['키'].mean()
 
혈액형  성별
A    남자    175.140
     여자    161.050
AB   남자    176.500
B    남자    183.000
     여자        NaN
O    남자    177.875
Name: 키, dtype: float64
 

9. 결측값 채우기

<bound method DataFrame.info of     name  group  company gender    birthday  height blood     brand
0     지민  방탄소년단      빅히트     남자  1995-10-13   173.6     A  10523260
1   지드래곤     빅뱅       YG     남자  1988-08-18   177.0     A   9916947
2   강다니엘    NaN      커넥트     남자  1996-12-10   180.0     A   8273745
3        방탄소년단      빅히트     남자  1995-12-30   178.0    AB   8073501
4     화사    마마무      RBW     여자  1995-07-23   162.1     A   7650928
5     정국  방탄소년단      빅히트     남자  1997-09-01   178.0     A   5208335
6     민현   뉴이스트     플레디스     남자  1995-08-09   182.3     O   4989792
7     소연    아이들       큐브     여자  1998-08-26     NaN     B   4668615
8        방탄소년단      빅히트     남자  1992-12-04   179.2     O   4570308
9    하성운     핫샷  스타크루이엔티     남자  1994-03-22   167.1     A   4036489
10    태연   소녀시대       SM     여자  1989-03-09     NaN     A   3918661
11   차은우   아스트로     판타지오     남자  1997-03-30   183.0     B   3506027
12    백호   뉴이스트     플레디스     남자  1995-07-21   175.0    AB   3301654
13    JR   뉴이스트     플레디스     남자  1995-06-08   176.0     O   3274137
14    슈가  방탄소년단      빅히트     남자  1993-03-09   174.0     O   2925442>
 
 

반응형

'Python > 데이터분석' 카테고리의 다른 글

Python 데이터분석 matplotlib  (0) 2023.02.19
Python 데이터 분석 Data Preprecessing  (0) 2023.02.18
Pythone Pandas(판다스) 기본  (0) 2023.02.17
Python 데이터분석 Numpy 2  (0) 2023.02.16
Python 데이터 분석 Numpy  (0) 2023.02.16