>백엔드 개발 >파이썬 튜토리얼 >Python 데이터 처리 라이브러리 pandas 시작하기

Python 데이터 처리 라이브러리 pandas 시작하기

不言
不言원래의
2018-04-19 10:45:592374검색

pandas는 Python 언어 소프트웨어 패키지로, 기계 학습 프로그래밍에 Python 언어를 사용할 때 매우 일반적으로 사용되는 기본 프로그래밍 라이브러리입니다. 이 글은 Python 데이터 처리 라이브러리 pandas에 대한 입문 튜토리얼입니다. 관심 있는 친구들은 꼭 읽어보세요.

pandas는 Python 언어를 기계 학습 프로그래밍에 사용할 때 사용하는 소프트웨어입니다. 이것은 매우 일반적으로 사용되는 기본 프로그래밍 라이브러리입니다. 이 기사는 이에 대한 입문 튜토리얼입니다.

pandas는 "관계형" 또는 "태그가 지정된" 데이터 작업을 쉽고 직관적으로 만들 수 있도록 설계된 빠르고 유연하며 표현력이 풍부한 데이터 구조를 제공합니다. Python에서 실용적인 데이터 분석을 위한 높은 수준의 빌딩 블록으로 만들어졌습니다.

소개

pandas는 다음을 포함한 다양한 유형의 데이터에 적합합니다.

  • SQL 테이블 또는 Excel 데이터와 같은 이질적인 유형의 열이 있는 테이블 형식 데이터

  • 순서가 있는 것과 순서가 없는 것(반드시 그렇지는 않음) 고정 주파수) 시계열 데이터.

  • 행 및 열 레이블이 있는 임의의 행렬 데이터(균일 유형 또는 다른 유형)

  • 관찰/통계 데이터 세트의 다른 형태.


이것은 Python 언어 소프트웨어 패키지이므로 먼저 컴퓨터에 Python 언어 환경이 있어야 합니다. 이에 관해서는 인터넷에서 직접 구하는 방법을 검색해 보시기 바랍니다.

pandas를 구하는 방법은 공식 웹사이트인 pandas Installation의 지침을 참조하세요.

일반적으로 pip를 통해 설치를 수행할 수 있습니다:

sudo pip3 install pandas


또는 conda를 통해 pandas 설치:


현재(2018년 2월) panda s 최신 버전은 v0.22입니다. 0(출시일 2017년 12월 29일).

이 기사의 소스 코드와 테스트 데이터를 Github: pandas_tutorial에 올렸습니다. 독자들은 가서 얻을 수 있습니다.

또한 pandas는 NumPy와 함께 사용되는 경우가 많으며, 이 글의 소스 코드에도 NumPy가 사용됩니다.

팬더를 배우기 전에 독자들이 NumPy에 익숙해지는 것이 좋습니다. 이전에 NumPy에 대한 기본 튜토리얼을 작성했습니다. 여기를 참조하세요. Python Machine Learning Library NumPy Tutorial

핵심 데이터 구조

핵심 pandas 그 것들은
두 개의 데이터 구조입니다.

이 두 가지 유형의 데이터 구조를 비교하면 다음과 같습니다. SeriesDataFrame

DataFrame은 시리즈의 컨테이너로 간주될 수 있습니다. 즉, DataFrame은 여러 시리즈를 포함할 수 있습니다.

참고: 버전 0.20.0 이전에는 Panel이라는 3차원 데이터 구조가 있었습니다. 이것이 팬더 라이브러리의 이름이 panda-s인 이유이기도 합니다. 그러나 이 데이터 구조는 거의 사용되지 않기 때문에 폐기되었습니다.


Series

Series는 1차원 구조의 데이터이므로 다음과 같이 배열을 통해 이러한 종류의 데이터를 직접 생성할 수 있습니다.

conda install pandas

이 코드의 출력은 다음과 같습니다.

# data_structure.py
import pandas as pd
import numpy as np
series1 = pd.Series([1, 2, 3, 4])
print("series1:\n{}\n".format(series1))

이 출력 설명은 다음과 같습니다.

출력의 마지막 줄은 Series의 데이터 유형이며 여기의 데이터는 모두 int64 유형입니다.
  • 두 번째 열에 데이터가 출력되고, 첫 번째 열은 데이터의 인덱스인데, 팬더에서는 Index라고 합니다.

  • 시리즈의 데이터와 인덱스를 각각 인쇄할 수 있습니다.

series1:
0 1
1 2
2 3
3 4
dtype: int64

이 두 줄의 코드 출력은 다음과 같습니다.

# data_structure.py
print("series1.values: {}\n".format(series1.values))
print("series1.index: {}\n".format(series1.index))

그렇지 않은 경우 위와 같이 지정하면 인덱스는 [1, N-1] 형식입니다. 그러나 시리즈를 생성할 때 인덱스를 지정할 수도 있습니다. 인덱스는 반드시 정수일 필요는 없으며 문자열과 같은 모든 유형의 데이터일 수 있습니다. 예를 들어, 7개의 음표를 매핑하기 위해 7개의 문자를 사용합니다. 인덱스의 목적은 다음과 같은 해당 데이터를 얻는 것입니다.

series1.values: [1 2 3 4]
series1.index: RangeIndex(start=0, stop=4, step=1)

이 코드의 출력은 다음과 같습니다.

# data_structure.py
series2 = pd.Series([1, 2, 3, 4, 5, 6, 7],
 index=["C", "D", "E", "F", "G", "A", "B"])
print("series2:\n{}\n".format(series2))
print("E is {}\n".format(series2["E"]))

DataFrame 생성을 살펴보겠습니다. . NumPy 인터페이스를 통해 4x4 행렬을 생성하여 다음과 같이 DataFrame을 생성할 수 있습니다.

series2:
C 1
D 2
E 3
F 4
G 5
A 6
B 7
dtype: int64
E is 3
DataFrame

이 코드의 출력은 다음과 같습니다.

# data_structure.py
df1 = pd.DataFrame(np.arange(16).reshape(4,4))
print("df1:\n{}\n".format(df1))

이 출력에서 ​​우리는 기본값을 볼 수 있습니다. 인덱스 및 열 이름은 [0, N-1] 형식입니다.

DataFrame을 생성할 때 다음과 같이 열 이름과 인덱스를 지정할 수 있습니다.

df1:
 0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15

이 코드의 출력은 다음과 같습니다.

# data_structure.py
df2 = pd.DataFrame(np.arange(16).reshape(4,4),
 columns=["column1", "column2", "column3", "column4"],
 index=["a", "b", "c", "d"])
print("df2:\n{}\n".format(df2))

열 데이터를 직접 지정하여 DataFrame :

ame
df2:
 column1 column2 column3 column4
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15

이 코드의 출력은 다음과 같습니다. 시리즈 배열을 사용하면 각 시리즈는 열이 아닌 행이 됩니다.

예:

# data_structure.py
noteSeries = pd.Series(["C", "D", "E", "F", "G", "A", "B"],
 index=[1, 2, 3, 4, 5, 6, 7])
weekdaySeries = pd.Series(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
 index=[1, 2, 3, 4, 5, 6, 7])
df4 = pd.DataFrame([noteSeries, weekdaySeries])
print("df4:\n{}\n".format(df4))

df4的输出如下:

df4:
 1 2 3 4 5 6 7
0 C D E F G A B
1 Mon Tue Wed Thu Fri Sat Sun

我们可以通过下面的形式给DataFrame添加或者删除列数据:

# data_structure.py
df3["No."] = pd.Series([1, 2, 3, 4, 5, 6, 7])
print("df3:\n{}\n".format(df3))
del df3["weekday"]
print("df3:\n{}\n".format(df3))


这段代码输出如下:

df3:
 note weekday No.
0 C Mon 1
1 D Tue 2
2 E Wed 3
3 F Thu 4
4 G Fri 5
5 A Sat 6
6 B Sun 7
df3:
 note No.
0 C 1
1 D 2
2 E 3
3 F 4
4 G 5
5 A 6
6 B 7

Index对象与数据访问

pandas的Index对象包含了描述轴的元数据信息。当创建Series或者DataFrame的时候,标签的数组或者序列会被转换成Index。可以通过下面的方式获取到DataFrame的列和行的Index对象:

# data_structure.py
print("df3.columns\n{}\n".format(df3.columns))
print("df3.index\n{}\n".format(df3.index))

这两行代码输出如下:

df3.columns
Index(['note', 'No.'], dtype='object')
df3.index
RangeIndex(start=0, stop=7, step=1)


请注意:

  • Index并非集合,因此其中可以包含重复的数据

  • Index对象的值是不可以改变,因此可以通过它安全的访问数据


DataFrame提供了下面两个操作符来访问其中的数据:

  • loc:通过行和列的索引来访问数据

  • iloc:通过行和列的下标来访问数据

例如这样:

# data_structure.py
print("Note C, D is:\n{}\n".format(df3.loc[[0, 1], "note"]))
print("Note C, D is:\n{}\n".format(df3.iloc[[0, 1], 0]))

第一行代码访问了行索引为0和1,列索引为“note”的元素。第二行代码访问了行下标为0和1(对于df3来说,行索引和行下标刚好是一样的,所以这里都是0和1,但它们却是不同的含义),列下标为0的元素。

这两行代码输出如下:

Note C, D is:
0 C
1 D
Name: note, dtype: object

Note C, D is:
0 C
1 D
Name: note, dtype: object

文件操作

pandas库提供了一系列的read_函数来读取各种格式的文件,它们如下所示:

  • read_csv

  • read_table

  • read_fwf

  • read_clipboard

  • read_excel

  • read_hdf

  • read_html

  • read_json

  • read_msgpack

  • read_pickle

  • read_sas

  • read_sql

  • read_stata

  • read_feather


读取Excel文件

注:要读取Excel文件,还需要安装另外一个库:xlrd

通过pip可以这样完成安装:

sudo pip3 install xlrd


安装完之后可以通过pip查看这个库的信息:

$ pip3 show xlrd
Name: xlrd
Version: 1.1.0
Summary: Library for developers to extract data from Microsoft Excel (tm) spreadsheet files
Home-page: http://www.python-excel.org/
Author: John Machin
Author-email: sjmachin@lexicon.net
License: BSD
Location: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages
Requires:


接下来我们看一个读取Excel的简单的例子:

# file_operation.py
import pandas as pd
import numpy as np
df1 = pd.read_excel("data/test.xlsx")
print("df1:\n{}\n".format(df1))


这个Excel的内容如下:

df1:
 C Mon
0 D Tue
1 E Wed
2 F Thu
3 G Fri
4 A Sat
5 B Sun

注:本文的代码和数据文件可以通过文章开头提到的Github仓库获取。

读取CSV文件

下面,我们再来看读取CSV文件的例子。

第一个CSV文件内容如下:

$ cat test1.csv 
C,Mon
D,Tue
E,Wed
F,Thu
G,Fri
A,Sat

读取的方式也很简单:

# file_operation.py
df2 = pd.read_csv("data/test1.csv")
print("df2:\n{}\n".format(df2))

我们再来看第2个例子,这个文件的内容如下:

$ cat test2.csv 
C|Mon
D|Tue
E|Wed
F|Thu
G|Fri
A|Sat


严格的来说,这并不是一个CSV文件了,因为它的数据并不是通过逗号分隔的。在这种情况下,我们可以通过指定分隔符的方式来读取这个文件,像这样:

# file_operation.py
df3 = pd.read_csv("data/test2.csv", sep="|")
print("df3:\n{}\n".format(df3))

实际上,read_csv支持非常多的参数用来调整读取的参数,如下表所示:


를 대체하는 일련의 값keep_date_col열을 구문 분석된 날짜에 연결하는 경우 연결된 열을 유지합니다. 기본값은 . <td style="box-sizing: border-box; vertical-align: top; padding-bottom: 2px; padding-top: 2px; padding-left: 10px; padding-right: 10px"></td>converters 열 변환기
Parameter Description
path 파일 경로
sep 또는 구분 기호 필드 구분 기호
header 열 이름 줄 수, 기본값은 0( 첫 번째 행)
index_col 열 번호 또는 이름은 결과에서 행 인덱스로 사용됩니다
names 결과의 열 이름 목록
skiprows 행 수 시작 위치에서 건너뛰기
na_values NA
comment 줄 끝으로 주석을 구분하는 문자
parse_dates 데이터를 날짜 시간. 기본값은 <code class="highlighter-rouge" style='box-sizing: border-box; font-size: 12px; font-family: Menlo, Monaco, Consolas, "Courier New", monospace, Helvetica, Tahoma, Arial, "Hiragino Sans GB", "Heiti SC", "WenQuanYi Micro Hei", 文泉驿微米黑, STXihei, 华文细黑, "Microsoft YaHei", 微软雅黑, SimSun, 宋体, Heiti, 黑体, sans-serif; color: rgb(199,37,78); padding-bottom: 2px; padding-top: 2px; padding-left: 4px; padding-right: 4px; background-color: rgb(249,242,244); border-radius: 4px'>datetime。默认为False
keep_date_col 如果将列连接到解析日期,保留连接的列。默认为False
🎜🎜🎜dayfirst🎜🎜 모호성을 유발할 수 있는 날짜를 구문 분석하는 경우 내부 형식으로 저장하세요.기본값은 False
data_parser 用来解析日期的函数
nrows 从文件开始读取的行数
iterator 返回一个TextParser对象,用于读取部分内容
chunksize 指定读取块的大小
skip_footer 文件末尾需要忽略的行数
verbose 输出各种解析输出的信息
encoding 文件编码
squeeze 如果解析的数据只包含一列,则返回一个Series
thousands 수천 개의 구분 기호
입니다.

详细的read_csv函数说明请参见这里:pandas.read_csv

处理无效值

现实世界并非完美,我们读取到的数据常常会带有一些无效值。如果没有处理好这些无效值,将对程序造成很大的干扰。

对待无效值,主要有两种处理方法:直接忽略这些无效值;或者将无效值替换成有效值。

下面我先创建一个包含无效值的数据结构。然后通过pandas.isna函数来确认哪些值是无效的:

# process_na.py
import pandas as pd
import numpy as np
df = pd.DataFrame([[1.0, np.nan, 3.0, 4.0],
   [5.0, np.nan, np.nan, 8.0],
   [9.0, np.nan, np.nan, 12.0],
   [13.0, np.nan, 15.0, 16.0]])
print("df:\n{}\n".format(df));
print("df:\n{}\n".format(pd.isna(df)));****

这段代码输出如下:

df:
 0 1 2 3
0 1.0 NaN 3.0 4.0
1 5.0 NaN NaN 8.0
2 9.0 NaN NaN 12.0
3 13.0 NaN 15.0 16.0
df:
 0 1 2 3
0 False True False False
1 False True True False
2 False True True False
3 False True False False

忽略无效值

我们可以通过pandas.DataFrame.dropna函数抛弃无效值:

# process_na.py
print("df.dropna():\n{}\n".format(df.dropna()));


注:dropna默认不会改变原先的数据结构,而是返回了一个新的数据结构。如果想要直接更改数据本身,可以在调用这个函数的时候传递参数 inplace = True。

对于原先的结构,当无效值全部被抛弃之后,将不再是一个有效的DataFrame,因此这行代码输出如下:

df.dropna():
Empty DataFrame
Columns: [0, 1, 2, 3]
Index: []


我们也可以选择抛弃整列都是无效值的那一列:

# process_na.py
print("df.dropna(axis=1, how=&#39;all&#39;):\n{}\n".format(df.dropna(axis=1, how=&#39;all&#39;)));


注:axis=1表示列的轴。how可以取值'any'或者'all',默认是前者。

这行代码输出如下:

df.dropna(axis=1, how=&#39;all&#39;):
 0 2 3
0 1.0 3.0 4.0
1 5.0 NaN 8.0
2 9.0 NaN 12.0
3 13.0 15.0 16.0

替换无效值

我们也可以通过fillna函数将无效值替换成为有效值。像这样:

# process_na.py
print("df.fillna(1):\n{}\n".format(df.fillna(1)));

这段代码输出如下:

df.fillna(1):
  0 1  2  3
0 1.0 1.0 3.0 4.0
1 5.0 1.0 1.0 8.0
2 9.0 1.0 1.0 12.0
3 13.0 1.0 15.0 16.0


将无效值全部替换成同样的数据可能意义不大,因此我们可以指定不同的数据来进行填充。为了便于操作,在填充之前,我们可以先通过rename方法修改行和列的名称:

# process_na.py

df.rename(index={0: &#39;index1&#39;, 1: &#39;index2&#39;, 2: &#39;index3&#39;, 3: &#39;index4&#39;},
   columns={0: &#39;col1&#39;, 1: &#39;col2&#39;, 2: &#39;col3&#39;, 3: &#39;col4&#39;},
   inplace=True);
df.fillna(value={&#39;col2&#39;: 2}, inplace=True)
df.fillna(value={&#39;col3&#39;: 7}, inplace=True)
print("df:\n{}\n".format(df));

这段代码输出如下:

df:
  col1 col2 col3 col4
index1 1.0 2.0 3.0 4.0
index2 5.0 2.0 7.0 8.0
index3 9.0 2.0 7.0 12.0
index4 13.0 2.0 15.0 16.0


处理字符串

数据中常常牵涉到字符串的处理,接下来我们就看看pandas对于字符串操作。

Series的str字段包含了一系列的函数用来处理字符串。并且,这些函数会自动处理无效值。

下面是一些实例,在第一组数据中,我们故意设置了一些包含空格字符串:

# process_string.py
import pandas as pd
s1 = pd.Series([&#39; 1&#39;, &#39;2 &#39;, &#39; 3 &#39;, &#39;4&#39;, &#39;5&#39;]);
print("s1.str.rstrip():\n{}\n".format(s1.str.lstrip()))
print("s1.str.strip():\n{}\n".format(s1.str.strip()))
print("s1.str.isdigit():\n{}\n".format(s1.str.isdigit()))

在这个实例中我们看到了对于字符串strip的处理以及判断字符串本身是否是数字,这段代码输出如下:

s1.str.rstrip():
0  1
1 2 
2 3 
3  4
4  5
dtype: object
s1.str.strip():
0 1
1 2
2 3
3 4
4 5
dtype: object
s1.str.isdigit():
0 False
1 False
2 False
3  True
4  True
dtype: bool


下面是另外一些示例,展示了对于字符串大写,小写以及字符串长度的处理:

# process_string.py
s2 = pd.Series([&#39;Stairway to Heaven&#39;, &#39;Eruption&#39;, &#39;Freebird&#39;,
     &#39;Comfortably Numb&#39;, &#39;All Along the Watchtower&#39;])
print("s2.str.lower():\n{}\n".format(s2.str.lower()))
print("s2.str.upper():\n{}\n".format(s2.str.upper()))
print("s2.str.len():\n{}\n".format(s2.str.len()))


该段代码输出如下:

s2.str.lower():
0   stairway to heaven
1     eruption
2     freebird
3   comfortably numb
4 all along the watchtower
dtype: object

s2.str.upper():
0   STAIRWAY TO HEAVEN
1     ERUPTION
2     FREEBIRD
3   COMFORTABLY NUMB
4 ALL ALONG THE WATCHTOWER
dtype: object

s2.str.len():
0 18
1  8
2  8
3 16
4 24
dtype: int64

相关推荐:

Python数据分析库pandas基本操作方法_python

python之Numpy和Pandas的使用介绍

위 내용은 Python 데이터 처리 라이브러리 pandas 시작하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.