본문 바로가기
데이터 분석

판다스2

by 코낄2 2023. 12. 8.

1. 결측값(Null, NaN)

결측값은 데이터에서 값이 누락되거나 측정되지 않은 상태를 나타냅니다. 판다스에서는 NaN(Not a Number)로 표기된 것은 모두 결측값으로 취급합니다. 결측값은 데이터 분석 및 통계 모델링에서 문제를 일으킬 수 있으며, 이를 처리하는 방법은 중요합니다. 일반적인 접근법은 결측값을 다른 값으로 대체하거나 해당 행 또는 열을 삭제하는 것입니다. 또는 결측값을 예측하는 모델을 사용하여 대체할 수도 있습니다. 처리 방법은 데이터의 특성과 분석 목적에 따라 다를 수 있습니다.

기본 df 모습

  • isna() / isnull() : 각 요소가 결측값인지 여부를 불리언으로 반환합니다.
df.isna()
df.isnull()
name	group	company	gender	birthday	height	blood	brand
0	False	False	False	False	False	False	False	False
1	False	False	False	False	False	False	False	False
2	False	True	False	False	False	False	False	False
3	False	False	False	False	False	False	False	False
4	False	False	False	False	False	False	False	False
5	False	False	False	False	False	False	False	False
6	False	False	False	False	False	False	False	False
7	False	False	False	False	False	True	False	False
8	False	False	False	False	False	False	False	False
9	False	False	False	False	False	False	False	False
10	False	False	False	False	False	True	False	False
11	False	False	False	False	False	False	False	False
12	False	False	False	False	False	False	False	False
13	False	False	False	False	False	False	False	False
14	False	False	False	False	False	False	False	False

한 행의 결측값만 볼 때

df['group'].isna()
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['name'][df['group'].isna()]
# 'group'이 NaN 값인 'name'열의 행
2    강다니엘
Name: name, dtype: object

df[df['group'].notnull()]
# 'group'이 notull인 행들만 출력
	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
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
df.loc[df['group'].notnull(), ['name', 'height', 'blood']]

=> 'group'열이 null이 아닌 행들, ['name', 'height', 'blood']열들만 출력

	name	height	blood
0	지민	173.6	A
1	지드래곤	177.0	A
3	뷔	178.0	AB
4	화사	162.1	A
5	정국	178.0	A
6	민현	182.3	O
7	소연	NaN	B
8	진	179.2	O
9	하성운	167.1	A
10	태연	NaN	A
11	차은우	183.0	B
12	백호	175.0	AB
13	JR	176.0	O
14	슈가	174.0	O

2. Null값 처리하기

  1.  Null인 정보 모두 없애기
  2. 평균값으로 대체해서 넣기
  3. 50%값으로 대체해서 넣기

평균값은 데이터가 정규분포에 가까울 때 또는 이상치가 크게 영향을 미치지 않을 때 유용하며, 중앙값은 데이터가 비대칭이거나 이상치에 민감할 때 유용합니다.

  • fillna() : 결측값을 채워주는 함수. 괄호 안의 값으로 대체함. 인플레이스 연산이 아님.
  • fillna(0, inplace = True) 할 경우 인플레이스 연산이 된다.
df['height'].fillna(0)
0     173.6
1     177.0
2     180.0
3     178.0
4     162.1
5     178.0
6     182.3
7       0.0
8     179.2
9     167.1
10      0.0
11    183.0
12    175.0
13    176.0
14    174.0
Name: height, dtype: float64
height = df2['height'].mean() # 175.7923076923077
df2['height'] = df2['height'].fillna(height) # 평균값 채워넣음
print(df2['height'])
0     173.600000
1     177.000000
2     180.000000
3     178.000000
4     162.100000
5     178.000000
6     182.300000
7     175.792308
8     179.200000
9     167.100000
10    175.792308
11    183.000000
12    175.000000
13    176.000000
14    174.000000
Name: height, dtype: float64
height = df2['height'].median() # 중앙값
df2['height'] = df2['height'].fillna(height)
print(df2['height'])
0     173.6
1     177.0
2     180.0
3     178.0
4     162.1
5     178.0
6     182.3
7     177.0
8     179.2
9     167.1
10    177.0
11    183.0
12    175.0
13    176.0
14    174.0
Name: height, dtype: float64
  • dropna() : 결측값이 있는 행, 열 제거. 결측값이 한개라도 있는 경우 삭제. inplace  연산 아님
  • dropna(axis = 1) : 결측값이 있는 열을 제거. 기본값은 axis = 0으로 생략할 경우 행 제거
df2.dropna()
	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
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
8	진	방탄소년단	빅히트		남자	1992-12-04	179.2	O	4570308
9	하성운	핫샷		스타크루이엔티	남자	1994-03-22	167.1	A	4036489
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

df2.dropna(axis=1)
	name	company		gender	birthday	blood	brand
0	지민	빅히트		남자	1995-10-13	A	10523260
1	지드래곤	YG		남자	1988-08-18	A	9916947
2	강다니엘	커넥트		남자	1996-12-10	A	8273745
3	뷔	빅히트		남자	1995-12-30	AB	8073501
4	화사	RBW		여자	1995-07-23	A	7650928
5	정국	빅히트		남자	1997-09-01	A	5208335
6	민현	플레디스		남자	1995-08-09	O	4989792
7	소연	큐브		여자	1998-08-26	B	4668615
8	진	빅히트		남자	1992-12-04	O	4570308
9	하성운	스타크루이엔티	남자	1994-03-22	A	4036489
10	태연	SM		여자	1989-03-09	A	3918661
11	차은우	판타지오		남자	1997-03-30	B	3506027
12	백호	플레디스		남자	1995-07-21	AB	3301654
13	JR	플레디스	남자	1995-06-08	O	3274137
14	슈가	빅히트	남자	1993-03-09	O	2925442

3. 행, 열 추가 및 삭제

  • 행을 추가할 때 딕셔너리 형태의 데이터를 만들고 append()함수를 사용하여 데이터를 추가합니다.
    ignore_index = True 옵션을 추가해야 에러가 발생하지 않습니다.
dic1 = {
    'name' : '김사과',
    'group': '과수원',
    'company': 'apple',
    'gender':'여자',
    'birthday': '2000-01-01',
    'height': 160,
    'blood' : 'A',
    'brand' : 12345678
}
df = df.append(dic1, ignore_index=True)
  • 열을 추가할 때는 df['nation] = '대한민국' 으로 없는 열의 이름을 정의해주면 해당 열을 생성합니다.
df['nation'] = '대한민국'
df.loc[df['name']=='김사과', 'nation'] = '미국'

0	태연	소녀시대	SM	여자	1989-03-09	NaN	A	3918661	대한민국
1	차은우	아스트로	판타지오	남자	1997-03-30	183.0	B	3506027	대한민국
2	백호	뉴이스트	플레디스	남자	1995-07-21	175.0	AB	3301654	대한민국
3	JR	뉴이스트	플레디스	남자	1995-06-08	176.0	O	3274137	대한민국
4	김사과	과수원	apple	여자	2000-01-01	160.0	A	12345678	미국
  • 열 제거하기 drop( 열 이름 , axis = 1)
  • 행 제거하기 drop( 행 인덱스 , axis = 0)
df.drop(['group','company'], axis = 1)
	name	gender	birthday	height	blood	brand		nation
0	지민	남자	1995-10-13	173.6	A	10523260	대한민국
1	지드래곤	남자	1988-08-18	177.0	A	9916947		대한민국
2	강다니엘	남자	1996-12-10	180.0	A	8273745		대한민국
3	뷔	남자	1995-12-30	178.0	AB	8073501		대한민국
4	화사	여자	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	태연	여자	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		대한민국
15	김사과	여자	2000-01-01	160.0	A	12345678	미국
df.drop([1,3,5,15], axis = 0)
	name	group		company	gender	birthday	height	blood	brand	nation
0	지민	방탄소년단	빅히트	남자	1995-10-13	173.6	A	10523260대한민국
2	강다니엘	NaN		커넥트	남자	1996-12-10	180.0	A	8273745	대한민국
4	화사	마마무		RBW	여자	1995-07-23	162.1	A	7650928	대한민국
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	대한민국

4. 통계함수

  • descibe()

describe() 함수는 판다스 데이터프레임 또는 시리즈의 간단한 통계 요약 정보를 제공하는 함수입니다. 주로 수치형 데이터의 특성을 살펴보기 위해 사용됩니다. 이 함수의 출력은 다음과 같은 통계적인 정보를 제공합니다:

  • 개수(count): 데이터의 총 개수
  • 평균(mean): 데이터의 평균값
  • 표준편차(std): 데이터의 표준편차 (변량의 정도를 나타내는 지표)
  • 최소값(min): 데이터의 최솟값
  • 25%, 50%, 75% 지점의 백분위수(25%, 50%, 75%): 데이터의 분포를 나타내는 백분위수 값
  • 최대값(max): 데이터의 최댓값
df.describe()
	height		brand
count	14.000000	1.600000e+01
mean	174.664286	6.073970e+06
std	7.006218	2.968869e+06
min	160.000000	2.925442e+06
25%	173.700000	3.815502e+06
50%	176.500000	4.829204e+06
75%	178.900000	8.123562e+06
max	183.000000	1.234568e+07
df['height'].sum()  # 합계
df['height'].count() # NaN을 포함하지 않음
df['height'].mean() # 평균
df['height'].median() # 중앙값
df['height'].max() # 최대값
df['height'].min() # 최소값
df['height'].var() # 분산: 데이터가 평균으로부터 퍼져있는 정도
df['height'].std() # 표준편차 : 분산에 루트를 씌움

5. 그룹으로 묶기

  • groupby() : 데이터를 그룹으로 묶어 분석할 때 사용
df.groupby('group').count()
		name	company	gender	birthdayheight	blood	brand	nation
group								
과수원		1	1	1	1	1	1	1	1
뉴이스트		3	3	3	3	3	3	3	3
마마무		1	1	1	1	1	1	1	1
방탄소년단	5	5	5	5	5	5	5	5
빅뱅		1	1	1	1	1	1	1	1
소녀시대		1	1	1	1	0	1	1	1
아스트로		1	1	1	1	1	1	1	1
아이들		1	1	1	1	0	1	1	1
핫샷		1	1	1	1	1	1	1	1
df.groupby('group').mean()
		height		brand
group		
과수원		160.000000	1.234568e+07
뉴이스트		177.766667	3.855194e+06
마마무		162.100000	7.650928e+06
방탄소년단	176.560000	6.260169e+06
빅뱅		177.000000	9.916947e+06
소녀시대		NaN		3.918661e+06
아스트로		183.000000	3.506027e+06
아이들		NaN		4.668615e+06
핫샷		167.100000	4.036489e+06

df.groupby('gender').mean()

	height		brand
gender		
남자	176.933333	5.716636e+06
여자	161.050000	7.145970e+06

df.groupby('group').sum()
		height		brand
group		
과수원		160.0	12345678
뉴이스트		533.3	11565583
마마무		162.1	7650928
방탄소년단	882.8	31300846
빅뱅		177.0	9916947
소녀시대		0.0	3918661
아스트로		183.0	3506027
아이들		0.0	4668615
핫샷		167.1	4036489
✔ 혈액형별로 그룹을 맺어, 키의 평균값을 확인
df.groupby('blood')['height'].mean()

blood
A     171.114286
AB    176.500000
B     183.000000
O     177.875000
Name: height, dtype: float64

✔ 혈액형별로 그룹을 맺고, 성별로 또 그룹을 나눈 후, 키의 평균값을 확인
df.groupby(['blood', 'gender'])['height'].mean()
blood  gender
A      남자        175.140
       여자        161.050
AB     남자        176.500
B      남자        183.000
       여자            NaN
O      남자        177.875
Name: height, dtype: float64

🔔 AB형, O형은 여자 데이터가 없고, B형에는 height가 NaN인 여자가 있음

6. 중복값 제거하기

  • drop_duplicates() : 중복된 데이터를 제거 (index 값은 해당 값이 제일 처음 등장한 순서값)
  • drop_duplicates(keep='last') : index 값이 해당 값이 제일 마지막에 있던 순서값
df['blood'].drop_duplicates()
0     A
3    AB
6     O
7     B
Name: blood, dtype: object

df['blood'].drop_duplicates(keep='last')
11     B
12    AB
14     O
15     A
Name: blood, dtype: object
  • value_counts() : 열의 각 값에 대한 데이터의 개수를 반환. NaN은 생략
  • value_counts( dropna = False) : NaN 생략하지 않고 count 함.
df['group'].value_counts()
방탄소년단    5
뉴이스트     3
빅뱅       1
마마무      1
아이들      1
핫샷       1
소녀시대     1
아스트로     1
과수원      1
Name: group, dtype: int64

df['group'].value_counts(dropna = False)
방탄소년단    5
뉴이스트     3
빅뱅       1
NaN      1
마마무      1
아이들      1
핫샷       1
소녀시대     1
아스트로     1
과수원      1
Name: group, dtype: int64

 

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

가상 쇼핑몰 데이터 예제  (0) 2023.12.16
Matplotlib  (0) 2023.12.10
판다스3  (0) 2023.12.08
판다스1  (0) 2023.12.05
넘파이  (0) 2023.11.28