pandas는 Python 언어 소프트웨어 패키지로, 기계 학습 프로그래밍에 Python 언어를 사용할 때 매우 일반적으로 사용되는 기본 프로그래밍 라이브러리입니다. 이 글은 Python 데이터 처리 라이브러리 pandas에 대한 입문 튜토리얼입니다. 관심 있는 친구들은 꼭 읽어보세요.
pandas는 Python 언어를 기계 학습 프로그래밍에 사용할 때 사용하는 소프트웨어입니다. 이것은 매우 일반적으로 사용되는 기본 프로그래밍 라이브러리입니다. 이 기사는 이에 대한 입문 튜토리얼입니다.
pandas는 "관계형" 또는 "태그가 지정된" 데이터 작업을 쉽고 직관적으로 만들 수 있도록 설계된 빠르고 유연하며 표현력이 풍부한 데이터 구조를 제공합니다. Python에서 실용적인 데이터 분석을 위한 높은 수준의 빌딩 블록으로 만들어졌습니다.
소개
pandas는 다음을 포함한 다양한 유형의 데이터에 적합합니다.
SQL 테이블 또는 Excel 데이터와 같은 이질적인 유형의 열이 있는 테이블 형식 데이터
순서가 있는 것과 순서가 없는 것(반드시 그렇지는 않음) 고정 주파수) 시계열 데이터.
행 및 열 레이블이 있는 임의의 행렬 데이터(균일 유형 또는 다른 유형)
관찰/통계 데이터 세트의 다른 형태.
이것은 Python 언어 소프트웨어 패키지이므로 먼저 컴퓨터에 Python 언어 환경이 있어야 합니다. 이에 관해서는 인터넷에서 직접 구하는 방법을 검색해 보시기 바랍니다.
pandas를 구하는 방법은 공식 웹사이트인 pandas Installation의 지침을 참조하세요.
일반적으로 pip를 통해 설치를 수행할 수 있습니다:
sudo pip3 install pandas
또는 conda를 통해 pandas 설치:
핵심 pandas 그 것들은
두 개의 데이터 구조입니다.
이 두 가지 유형의 데이터 구조를 비교하면 다음과 같습니다. Series
和DataFrame
DataFrame은 시리즈의 컨테이너로 간주될 수 있습니다. 즉, DataFrame은 여러 시리즈를 포함할 수 있습니다.
참고: 버전 0.20.0 이전에는 Panel이라는 3차원 데이터 구조가 있었습니다. 이것이 팬더 라이브러리의 이름이 panda-s인 이유이기도 합니다. 그러나 이 데이터 구조는 거의 사용되지 않기 때문에 폐기되었습니다.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 유형입니다.
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支持非常多的参数用来调整读取的参数,如下表所示:
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='all'):\n{}\n".format(df.dropna(axis=1, how='all')));
注:axis=1表示列的轴。how可以取值'any'或者'all',默认是前者。
这行代码输出如下:
df.dropna(axis=1, how='all'): 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: 'index1', 1: 'index2', 2: 'index3', 3: 'index4'}, columns={0: 'col1', 1: 'col2', 2: 'col3', 3: 'col4'}, inplace=True); df.fillna(value={'col2': 2}, inplace=True) df.fillna(value={'col3': 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([' 1', '2 ', ' 3 ', '4', '5']); 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(['Stairway to Heaven', 'Eruption', 'Freebird', 'Comfortably Numb', 'All Along the Watchtower']) 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 데이터 처리 라이브러리 pandas 시작하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!