pandas的基础操作

ASP.NET

基本概念

在pandas中,DataFrame指的是数据表,其columns属性是列头,index属性是行头,未指定的情况下都为自增整数序列。

Series指的是数据列。所以读取一个数据表文件会返回一个DataFrame,选择某一列会返回一个Series。

所有内容默认按如下方式引入pandas

1
import pandas as pd

读取数据

使用read_table()方法读取数据文件

1
data = pd.read_table('file') # file参数可以是文件路径,也可以是http地址

sep参数

默认的分隔符为TAB,可以使用sep参数指定分隔符

1
data = pd.read_table('file', sep=',') #例如将分隔符指定为","可以读取csv文件

header参数

默认会把第一行当作header,可以通过指定header=None告诉pandas文件中没有header

1
data = pd.read_table('file', sep=',', header=None)

names参数

如果想给读入的表指定header,可以通过names参数传入,会按顺序依次对应表格的headers

1
2
3
4
5
cols = ['Id', 'Name', 'Age', 'Address']
#如果表格文件本身没有header,需要指定header=None
data = pd.read_table('file', sep=',', header=None, names=cols)
#如果表格文件本身有header,但想要新header替换旧header,需要指定header=0,即第0行为header
data = pd.read_table('file', sep=',', header=0, names=cols)

nrows参数

使用nrows参数读取固定行数

skiprows参数

使用skiprows参数可以让pandas从开始跳过固定行数后再读取数据。

skipfooter参数

使用skipfooter参数可以让pandas从最后向前跳过固定行。

使用其它方法读取特定类型的表格

除了使用read_table()这种方法外,针对特定类型的文件可以使用:

  • read_csv()
  • read_excel()
  • read_json()
  • read_html()
  • read_clipboard()

等读取特定类型的文件。

选择数据列

选择单列数据

可以有两种方式选择单列数据,效果相同,返回Series:

1
2
data['Name']
data.Name

但如果列名称中包含空格,或者列名称与data的内建属性名称相冲突,则只能用data['Name']的方式。例如:

1
2
data['Phone Number'] # 列名称包含空格
data['shape'] # shape为内建属性

选择多列数据

读取时只读取选择列的数据

1
data = pd.read_csv('file', usecols=['Id', 'Name', 'Age'])

读入完整数据后选择列

1
2
3
4
selected = ['Id', 'Name' ,'Age']
s = data[selected]
#或者
s = data[['Id', 'Name', 'Age']]

添加

添加新列

1
data['Test'] = data.Name + ',' + data.Address # 添加名为Test的列

修改

修改列名称

1
data.rename(columns = {'OldName1':'NewName1', 'OldName2':'NewName2'}, inplace=True)

把表格列名称中的OldName1改为NewName1OldName2改为NewName2inplace=True意思是就地修改

可以通过重新赋值columns属性整体替换列名称,例如:

1
2
new_cols = ['NewCol1', 'NewCol2', 'NewCol3']
data.columns = new_cols

删除

删除列

可以使用drop()方法删除列:

1
2
data.drop('Age', axis=1, inplace=True) #删除单列
data.drop(['Age', 'Phone', 'Address'], axis=1, inplace=True) #删除多列

其中axis为坐标轴,axis=0是行坐标轴,对应的为行。axis=1为列坐标轴,对应的为列。代码中axis=1意思就是从列中删除名为“Age”的列。inplace=Ture意思是修改发生在当前data中。

删除行

同样可以使用drop()方法删除行, 只要指定axis=1即可。

1
data.drop([013], axis=0, inplace=True) #删除多列

axis=0可以省略,不过建议保留,可以明确看出来到底在做什么。

显示数据

  • head() 显示数据的前几行,可以指定行数,默认5行。
  • describe() 对于数据类型为数字的列,显示行数、均值、最大、最小、标准等
  • columns 显示表格行所有列标题
  • shape 显示表格行列大小
  • dtypes 显示表格各列的数据类型

排序

单列排序

使用列的sort_values()方法排序,返回新的排序后的列,并不改变原数据的顺序

1
2
data['Age'].sort_values() #按照升序排序Age列,返回Series
data['Age'].sort_values(ascending=False) #按照降序排序Age列,返回Series

表格排序

使用DataFrame的sort_values()方法给表格排序,返回排序后的表格,并不改变原数据的顺序。

1
2
3
data.sort_values('Age') #按照Age升序排列
data.sort_values('Age', ascending=False) #按照Age降序排列
data.sort_values(['Age', 'Name']) #先按照Age排序再按照Name排序

数据过滤

可以通过简易表达式返回Bool的Series

1
2
3
4
5
6
7
8
9
10
#使用pandas的广播的特性
data[data.Age>30] #筛选出年龄大于30的人
data[data.Age>30]['Name'] #筛选出年龄大于30的人,并只显示姓名列。

#因为data[data.Age>30]返回的是DataFrame,所以可以直接引用Name列,也可以使用loc达到同样效果
data.loc[data.Age>30, 'Name']
data[data.Age>30 & data.Country=='China'] #多个条件过滤

#当条件很多的情况下,可以使用isin
data[data.Country.isin(['China', 'Japan', 'USA'])]

其它

更多参数可以参见pandas的官方文档。

如果觉得有用请打赏一杯咖啡,谢谢 :P