Posts 판다스(Pandas) 기초(3)
Post
Cancel

판다스(Pandas) 기초(3)

1. Pandas io (input, output)


1.1 Load

1
2
titanic = pd.read_csv('datas/train.csv')
titanic.tail(2)
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
88989011Behr, Mr. Karl Howellmale26.00011136930.00C148C
89089103Dooley, Mr. Patrickmale32.0003703767.75NaNQ


  • csv = 콤마로 값을 분류
  • tsv = 탭으로 값을 분류
  • pd.read_xxx(경로, 옵션) 으로 불러온다
  • 타이타닉 데이터를 불러온것


1.2 Save

1
titanic.to_csv('datas/titanic.csv', index = False)
  • sep = 옵션을 조정하면 다른것으로 분류하는것도 가능, 예를 들자면 \t
  • index = 옵션은 보통 저장하지 않음, 어차피 로드할때 index가 저장됨
  • dataframe.to_xxx(경로, 옵션)으로 저장함


1.3 UnicodeDecodeError

1
2
pd.read_csv("datas/2014_p.csv")
df.tail
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
---------------------------------------------------------------------------

UnicodeDecodeError                        Traceback (most recent call last)

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._convert_tokens()


pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._convert_with_dtype()


pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._string_convert()


pandas/_libs/parsers.pyx in pandas._libs.parsers._string_box_utf8()


UnicodeDecodeError: 'utf-8' codec can't decode byte 0xba in position 0: invalid start byte


During handling of the above exception, another exception occurred:


UnicodeDecodeError                        Traceback (most recent call last)

<ipython-input-3-b8fe44f7bef5> in <module>
----> 1 pd.read_csv("datas/2014_p.csv")
      2 df.tail


/opt/anaconda3/lib/python3.8/site-packages/pandas/io/parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision)
    674         )
    675 
--> 676         return _read(filepath_or_buffer, kwds)
    677 
    678     parser_f.__name__ = name


/opt/anaconda3/lib/python3.8/site-packages/pandas/io/parsers.py in _read(filepath_or_buffer, kwds)
    452 
    453     try:
--> 454         data = parser.read(nrows)
    455     finally:
    456         parser.close()


/opt/anaconda3/lib/python3.8/site-packages/pandas/io/parsers.py in read(self, nrows)
   1131     def read(self, nrows=None):
   1132         nrows = _validate_integer("nrows", nrows)
-> 1133         ret = self._engine.read(nrows)
   1134 
   1135         # May alter columns / col_dict


/opt/anaconda3/lib/python3.8/site-packages/pandas/io/parsers.py in read(self, nrows)
   2035     def read(self, nrows=None):
   2036         try:
-> 2037             data = self._reader.read(nrows)
   2038         except StopIteration:
   2039             if self._first_chunk:


pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader.read()


pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._read_low_memory()


pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._read_rows()


pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._convert_column_data()


pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._convert_tokens()


pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._convert_with_dtype()


pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._string_convert()


pandas/_libs/parsers.pyx in pandas._libs.parsers._string_box_utf8()


UnicodeDecodeError: 'utf-8' codec can't decode byte 0xba in position 0: invalid start byte
  • uft-8 인코딩 옵션으로 읽을수 없다는 애러
  • 보통 utf-8이면 되는데, 간혹 다른 인코딩을 사용한 경우엔 그 옵션을 줘야함


1
2
df = pd.read_csv('datas/2014_p.csv', encoding='euc-kr')
df.tail()
IDRCTRCKRACE_DERACE_NOPARTCPT_NORANKRCHOSE_NMHRSMNRCORDARVL_DFFRNCEACH_SCTN_PASAGE_RANKA_WIN_SYTM_EXPECT_ALOTWIN_STA_EXPECT_ALOT
2721327214제주2014-11-29942.0황용신화이재웅0:01:27.14 - - - 5 - 5 - 21.82.2
2721427215제주2014-11-29452.0백록장원장우성0:01:19.9머리7 - - - 7 - 6 - 43.51.3
2721527216제주2014-11-29437.0산정무한안득수0:01:22.84 - - - 4 - 4 - 630.95.2
2721627217제주2014-11-29976.0미주여행김경휴0:01:31.1132 - - - 2 - 3 - 66.29.4
2721727218제주2014-11-29961.0철옹성장우성0:01:26.6NaN1 - - - 1 - 1 - 13.92.9


  • encoding 옵션을 euc-kr을 주어 파일을 제대로 읽어옴

1.4 Encoding 이란?

  • 문자를 컴퓨터 언어(2진수)로 바꾸는 방법 아래의 3가지가 가장 많이 쓰임
  • load시 encoding = “방법”을 적어주어야 함 보통은 utf-8
  • ascii : 영문, 숫자, 특문만 인코딩 가능
  • utf-8 : 영문 한글 일본어 등 모든나라의 언어방식을 인코딩 가능
  • euc-kr : 영문 한글 숫자 특문 인코딩 가능


2. Pandas Pivot


2.1 Pandas Pivot이란

  • 데이터 프레임의 컬럼데이터에서 index, column, value를 선택해서 데이터 프레임을 만드는 방법
  • df.pivot(index, columns, values)
    • groupby 하고 pivot을 실행 (index와 column이 중복되면 안됨)
  • df.pivot_table(values, index, columns, aggfunc


2.2 Pivot 학습

1
2
df1 = titanic.groupby(['Sex', 'Pclass']).size().reset_index(name = 'counts')
df1
SexPclasscounts
0female194
1female276
2female3144
3male1122
4male2108
5male3347
  • 유명한 타이타닉 데이터를 가지고 실습
  • 성별 좌석 등급에 따른 데이터의 수


1
2
result = df1.pivot('Sex', columns='Pclass', values='counts')
result
Pclass123
Sex
female9476144
male122108347
  • group by한 데이터 프레임에 pivot하여 테이블 형태로 만들었음


2.3 Pivot Table 학습

1
2
titanic['Counts'] = 1
titanic.tail(1)
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedCounts
89089103Dooley, Mr. Patrickmale32.0003703767.75NaNQ1


1
2
result = titanic.pivot_table('Counts', 'Sex', 'Survived',aggfunc= np.sum)
result
Survived01
Sex
female81233
male468109


  • 성별간 생존 인원수를 카운트한것
  • 0은 죽은것 1은 산것
  • dataframe.pivot_table(value, index, column, 통계수치 순으로 사용)


1
2
result = titanic.pivot_table('Counts', 'Pclass', 'Survived',aggfunc= np.sum)
result
Survived01
Pclass
180136
29787
3372119


  • 객실간 생존 인원수를 카운트한것


1
2
result['total'] = result[0] + result[1]
result
Survived01total
Pclass
180136216
29787184
3372119491


  • 토탈 만들기 (열)
  • Dataframe의 열을 선택후 더하기, 뺴기, 나누기 등 모든 산술연산자를 하여 새로운 컬럼을 생성 할수 있음


1
2
result.loc['total'] = result.loc[1] + result.loc[2] + result.loc[3]
result
Survived01total
Pclass
180136216
29787184
3372119491
total549342891


  • 토탈 만들기 (행))
  • 위와 똑같이 하면되나, 행은 loc 옵션을 주어 행을 선택하였다는것을 인지해주면 됨
This post is licensed under CC BY 4.0 by the author.