- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python 数据处理库 pandas 入门教程基本操作由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库。本文是对它的一个入门教程.
pandas提供了快速,灵活和富有表现力的数据结构,目的是使“关系”或“标记”数据的工作既简单又直观。它旨在成为在Python中进行实际数据分析的高级构建块.
入门介绍 。
pandas适合于许多不同类型的数据,包括:
由于这是一个Python语言的软件包,因此需要你的机器上首先需要具备Python语言的环境。关于这一点,请自行在网络上搜索获取方法.
关于如何获取pandas请参阅官网上的说明:pandas Installation.
通常情况下,我们可以通过pip来执行安装:
1
|
sudo pip3 install pandas
|
或者通过conda 来安装pandas:
1
|
conda install pandas
|
目前(2018年2月)pandas的最新版本是v0.22.0(发布时间:2017年12月29日).
我已经将本文的源码和测试数据放到Github上:pandas_tutorial ,读者可以前往获取.
另外,pandas常常和NumPy一起使用,本文中的源码中也会用到NumPy.
建议读者先对NumPy有一定的熟悉再来学习pandas,我之前也写过一个NumPy的基础教程,参见这里:Python 机器学习库 NumPy 教程 。
核心数据结构 。
pandas最核心的就是Series和DataFrame两个数据结构.
这两种类型的数据结构对比如下:
DataFrame可以看做是Series的容器,即:一个DataFrame中可以包含若干个Series.
注:在0.20.0版本之前,还有一个三维的数据结构,名称为Panel。这也是pandas库取名的原因:pan-da-s。但这种数据结构由于很少被使用到,因此已经被废弃了.
Series 。
由于Series是一维结构的数据,我们可以直接通过数组来创建这种数据,像这样:
1
2
3
4
5
|
# data_structure.py
import
pandas as pd
import
numpy as np
series1
=
pd.Series([
1
,
2
,
3
,
4
])
print
(
"series1:\n{}\n"
.
format
(series1))
|
这段代码输出如下:
1
2
3
4
5
6
|
series1:
0
1
1
2
2
3
3
4
dtype: int64
|
这段输出说明如下:
我们可以分别打印出Series中的数据和索引:
1
2
3
|
# data_structure.py
print
(
"series1.values: {}\n"
.
format
(series1.values))
print
(
"series1.index: {}\n"
.
format
(series1.index))
|
这两行代码输出如下:
1
2
|
series1.values: [
1
2
3
4
]
series1.index: RangeIndex(start
=
0
, stop
=
4
, step
=
1
)
|
如果不指定(像上面这样),索引是[1, N-1]的形式。不过我们也可以在创建Series的时候指定索引。索引未必一定需要是整数,可以是任何类型的数据,例如字符串。例如我们以七个字母来映射七个音符。索引的目的是可以通过它来获取对应的数据,例如下面这样:
1
2
3
4
5
|
# 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"
]))
|
这段代码输出如下:
1
2
3
4
5
6
7
8
9
10
11
|
series2:
C
1
D
2
E
3
F
4
G
5
A
6
B
7
dtype: int64
E
is
3
DataFrame
|
下面我们来看一下DataFrame的创建。我们可以通过NumPy的接口来创建一个4x4的矩阵,以此来创建一个DataFrame,像这样:
1
2
3
|
# data_structure.py
df1
=
pd.DataFrame(np.arange(
16
).reshape(
4
,
4
))
print
(
"df1:\n{}\n"
.
format
(df1))
|
这段代码输出如下:
1
2
3
4
5
6
|
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
|
从这个输出我们可以看到,默认的索引和列名都是[0, N-1]的形式.
我们可以在创建DataFrame的时候指定列名和索引,像这样:
1
2
3
4
5
|
# 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))
|
这段代码输出如下:
1
2
3
4
5
6
|
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
|
我们也可以直接指定列数据来创建DataFrame:
1
2
3
4
5
|
# data_structure.py
df3
=
pd.DataFrme({
"note"
: [
"C"
,
"D"
,
"E"
,
"F"
,
"G"
,
"A"
,
"B"
],
"weekday"
: [
"Mon"
,
"Tue"
,
"Wed"
,
"Thu"
,
"Fri"
,
"Sat"
,
"Sun"
]})
print
(
"df3:\n{}\n"
.
format
(df3))
|
这段代码输出如下:
1
2
3
4
5
6
7
8
9
|
df3:
note weekday
0
C Mon
1
D Tue
2
E Wed
3
F Thu
4
G Fri
5
A Sat
6
B Sun
|
请注意:
DataFrame的不同列可以是不同的数据类型 。
如果以Series数组来创建DataFrame,每个Series将成为一行,而不是一列 。
例如:
1
2
3
4
5
6
7
|
# 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的输出如下:
1
2
3
4
|
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添加或者删除列数据:
1
2
3
4
5
|
# 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))
|
这段代码输出如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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对象:
1
2
3
|
# data_structure.py
print
(
"df3.columns\n{}\n"
.
format
(df3.columns))
print
(
"df3.index\n{}\n"
.
format
(df3.index))
|
这两行代码输出如下:
1
2
3
4
|
df3.columns
Index([
'note'
,
'No.'
], dtype
=
'object'
)
df3.index
RangeIndex(start
=
0
, stop
=
7
, step
=
1
)
|
请注意:
DataFrame提供了下面两个操作符来访问其中的数据:
例如这样:
1
2
3
|
# 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的元素.
这两行代码输出如下:
1
2
3
4
5
6
7
8
9
|
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_函数来读取各种格式的文件,它们如下所示:
读取Excel文件 。
注:要读取Excel文件,还需要安装另外一个库:xlrd 。
通过pip可以这样完成安装:
1
|
sudo pip3 install xlrd
|
安装完之后可以通过pip查看这个库的信息:
1
2
3
4
5
6
7
8
9
10
|
$ 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的简单的例子:
1
2
3
4
5
|
# 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的内容如下:
1
2
3
4
5
6
7
8
|
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文件内容如下:
1
2
3
4
5
6
7
|
$ cat test1.csv
C,Mon
D,Tue
E,Wed
F,Thu
G,Fri
A,Sat
|
读取的方式也很简单:
1
2
3
|
# file_operation.py
df2
=
pd.read_csv(
"data/test1.csv"
)
print
(
"df2:\n{}\n"
.
format
(df2))
|
我们再来看第2个例子,这个文件的内容如下:
1
2
3
4
5
6
7
|
$ cat test2.csv
C|Mon
D|Tue
E|Wed
F|Thu
G|Fri
A|Sat
|
严格的来说,这并不是一个CSV文件了,因为它的数据并不是通过逗号分隔的。在这种情况下,我们可以通过指定分隔符的方式来读取这个文件,像这样:
1
2
3
|
# file_operation.py
df3
=
pd.read_csv(
"data/test2.csv"
, sep
=
"|"
)
print
(
"df3:\n{}\n"
.
format
(df3))
|
实际上,read_csv支持非常多的参数用来调整读取的参数,如下表所示:
。
参数 | 说明 |
---|---|
path | 文件路径 |
sep或者delimiter | 字段分隔符 |
header | 列名的行数,默认是0(第一行) |
index_col | 列号或名称用作结果中的行索引 |
names | 结果的列名称列表 |
skiprows | 从起始位置跳过的行数 |
na_values | 代替NA 的值序列 |
comment | 以行结尾分隔注释的字符 |
parse_dates | 尝试将数据解析为datetime 。默认为False |
keep_date_col | 如果将列连接到解析日期,保留连接的列。默认为False 。 |
converters | 列的转换器 |
dayfirst | 当解析可以造成歧义的日期时,以内部形式存储。默认为False |
data_parser | 用来解析日期的函数 |
nrows | 从文件开始读取的行数 |
iterator | 返回一个TextParser对象,用于读取部分内容 |
chunksize | 指定读取块的大小 |
skip_footer | 文件末尾需要忽略的行数 |
verbose | 输出各种解析输出的信息 |
encoding | 文件编码 |
squeeze | 如果解析的数据只包含一列,则返回一个Series |
thousands | 千数量的分隔符 |
。
详细的read_csv函数说明请参见这里:pandas.read_csv 。
处理无效值 。
现实世界并非完美,我们读取到的数据常常会带有一些无效值。如果没有处理好这些无效值,将对程序造成很大的干扰.
对待无效值,主要有两种处理方法:直接忽略这些无效值;或者将无效值替换成有效值.
下面我先创建一个包含无效值的数据结构。然后通过pandas.isna函数来确认哪些值是无效的:
1
2
3
4
5
6
7
8
9
|
# 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)));
*
*
*
*
|
这段代码输出如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
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函数抛弃无效值:
1
2
|
# process_na.py
print
(
"df.dropna():\n{}\n"
.
format
(df.dropna()));
|
注:dropna默认不会改变原先的数据结构,而是返回了一个新的数据结构。如果想要直接更改数据本身,可以在调用这个函数的时候传递参数 inplace = True.
对于原先的结构,当无效值全部被抛弃之后,将不再是一个有效的DataFrame,因此这行代码输出如下:
1
2
3
4
|
df.dropna():
Empty DataFrame
Columns: [
0
,
1
,
2
,
3
]
Index: []
|
我们也可以选择抛弃整列都是无效值的那一列:
1
2
|
# process_na.py
print
(
"df.dropna(axis=1, how='all'):\n{}\n"
.
format
(df.dropna(axis
=
1
, how
=
'all'
)));
|
注:axis=1表示列的轴。how可以取值'any'或者'all',默认是前者.
这行代码输出如下:
1
2
3
4
5
6
|
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函数将无效值替换成为有效值。像这样:
1
2
|
# process_na.py
print
(
"df.fillna(1):\n{}\n"
.
format
(df.fillna(
1
)));
|
这段代码输出如下:
1
2
3
4
5
6
|
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方法修改行和列的名称:
1
2
3
4
5
6
7
8
|
# 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));
|
这段代码输出如下:
1
2
3
4
5
6
|
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字段包含了一系列的函数用来处理字符串。并且,这些函数会自动处理无效值.
下面是一些实例,在第一组数据中,我们故意设置了一些包含空格字符串:
1
2
3
4
5
6
|
# 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的处理以及判断字符串本身是否是数字,这段代码输出如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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
|
。
下面是另外一些示例,展示了对于字符串大写,小写以及字符串长度的处理:
1
2
3
4
5
6
|
# 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
()))
|
该段代码输出如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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 入门教程基本操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
原文链接:http://qiangbo.space/2018-02-15/pandas_tutorial/ 。
最后此篇关于Python 数据处理库 pandas 入门教程基本操作的文章就讲到这里了,如果你想了解更多关于Python 数据处理库 pandas 入门教程基本操作的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在做一个关于代码学院的教程,我在这里收到一个错误,说“看起来你的函数没有返回‘唉,你没有资格获得信用卡。资本主义就是这样残酷。’”当收入参数为 75 时。”但是该字符串在控制台中返回(由于某种原因
我正在阅读 Go 的官方教程,但很难理解 Channel 和 Buffered Channels 之间的区别。教程的链接是 https://tour.golang.org/concurrency/2和
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
作为 iOS 新手,有大量书籍可以满足学习基础知识的需求。现在,我想转向一些高级阅读,例如 OAuth 和 SQLite 以及动态 API 派生的 TableView 等。您可以推荐任何资源吗? 最佳
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 8 年前。
前言 很多同学都知道,我们常见的CTF赛事除了解题赛之外,还有一种赛制叫AWD赛制。在这种赛制下,我们战队会拿到一个或多个服务器。服务器的连接方式通常是SSH链接,并且可能一个战队可能会同时有
Memcached是一个自由开源的,高性能,分布式内存键值对缓存系统 Memcached 是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象),这些数据可以是数据库调用、A
Perl 又名实用报表提取语言, 是 Practical Extraction and Report Language 的缩写 Perl 是由 拉里·沃尔(Larry Wall)于19
WSDL 是 Web Services Description Language 的缩写,翻译成中文就是网络服务描述语言 WSDL 是一门基于 XML 的语言,用于描述 Web Services 以
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我正在寻找解释在 WPF 中创建自定义用户控件的教程。 我想要一个控件,它结合了一个文本 block 、一个文本框和一个启动通用文件打开对话框的按钮。我已经完成了布局,一切都连接好了。它有效,但它是三
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我接近 fourth page of the Django tutorial 的开始看着vote查看,最后是这样的: # Always return an HttpResponseRedirect a
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
是否有任何好的 Qt QSS 教程,或者在某个地方我可以看到样式小部件的示例?如果某处可用,我想要一些完整的引用。除了有关如何设置按钮或某些选项卡样式的小教程外,我找不到任何其他内容。 最佳答案 Qt
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是一名优秀的程序员,十分优秀!