Pandas相关操作
Pandas 是python的一个数据分析包,在做NLP任务时可以极大的提高我们的处理效率,所以需要一些入门的知识。
小道会在这章里自己涉及到的全部pandas操作。文章是用MD写的,大家可以根据右侧的目录查看自己感兴趣的操作。
pandas读取csv文件
pandas读取csv文件使用函数read_csv,可以将csv文件读取为DataFrame。这里用示例详细演示。这里写一个csv文件,用作测试
with open("data/test_pandas_read.csv", 'w', encoding='utf-8') as fout:
fout.write("姓名,性别,年龄\n")
fout.write("张一,男,21\n")
fout.write("张二,男,22\n")
fout.write("张三,男,23\n")
fout.write("张四,男,24\n")
fout.write("张五,男,25\n")
fout.write("张六,男,26\n")
fout.write("张七,男,27\n")
fout.write("张八,男,28\n")
import pandas as pd
train_data = pd.read_csv("data/test_pandas_read.csv")
print(train_data)
姓名 性别 年龄
0 张一 男 21
1 张二 男 22
2 张三 男 23
3 张四 男 24
4 张五 男 25
5 张六 男 26
6 张七 男 27
7 张八 男 28
说明一下几个参数
- sep:分隔符,默认逗号
- header:指定行数作为列名,默认为第1行,如果没有header行就设置为None
- index_col:用作行索引的列编号
- names:用于结果的列名列表
- skiprows:忽略的行数
- nrows:读取的行数
#这里使用123作列索引,把第一行也作为数据读取,只读取前6行
train_data_test = pd.read_csv("data/test_pandas_read.csv", sep=",", header=None, names=['1','2','3'], nrows=6)
print(train_data_test)
1 2 3
0 姓名 性别 年龄
1 张一 男 21
2 张二 男 22
3 张三 男 23
4 张四 男 24
5 张五 男 25
pandas 的基本DataFrame操作
DataFrame 是一种二维的数据结构,非常接近于电子表格或者类似 mysql 数据库的形式。
它的竖行称之为 columns,横行称之为 index,也就是说可以通过 columns 和 index 来确定一个主句的位置。
上文的文件读入之后会成为一个DataFrame对象,下面列举常用的几个方法:
print(train_data)
姓名 性别 年龄
0 张一 男 21
1 张二 男 22
2 张三 男 23
3 张四 男 24
4 张五 男 25
5 张六 男 26
6 张七 男 27
7 张八 男 28
DataFrame的创建
- 通过列表创建
tmp = [1,2,3,4]
print("create with default index and column")
print(pd.DataFrame(tmp))
print("create with own index and column")
print(pd.DataFrame(tmp, columns=["name"], index=["num1","num2","num3","num4"]))
#二维列表创建
tmp_dim2 = [[1,2,3],[2,3,4]]
print("create use dimension 2 list")
# print(pd.DataFrame(tmp_dim2)
create with default index and column
0
0 1
1 2
2 3
3 4
create with own index and column
name
num1 1
num2 2
num3 3
num4 4
create use dimension 2 list
- 通过numpy数组创建
import numpy as np
tmp = np.array([[1,2,3],[1,2,3]])
print(pd.DataFrame(tmp))
np.random.randint(12)
tmp = np.reshape(np.random.random(12),(3,4))
print("numpy array use random")
print(pd.DataFrame(tmp))
0 1 2
0 1 2 3
1 1 2 3
numpy array use random
0 1 2 3
0 0.408672 0.161733 0.583770 0.081680
1 0.501434 0.156215 0.422717 0.079505
2 0.149095 0.683209 0.984084 0.927738
- 通过字典创建
print(pd.DataFrame({'name':["小道1","小道2"],'age':[23,24]}))
name age
0 小道1 23
1 小道2 24
DataFrame的常用方法
查看数据
- 查看前几行:head方法,默认5行
- 查看后几行:tail方法,默认5行
- 查看索引:index, column
- 查看数据:values,loc, iloc
print(train_data.head())
姓名 性别 年龄
0 张一 男 21
1 张二 男 22
2 张三 男 23
3 张四 男 24
4 张五 男 25
print(train_data.tail(3))
姓名 性别 年龄
5 张六 男 26
6 张七 男 27
7 张八 男 28
print("index of row\n",train_data.index)
print("index of column\n",train_data.columns)
print("data values\n",train_data.values)
index of row
RangeIndex(start=0, stop=8, step=1)
index of column
Index(['姓名', '性别', '年龄'], dtype='object')
data values
[['张一' '男' 21]
['张二' '男' 22]
['张三' '男' 23]
['张四' '男' 24]
['张五' '男' 25]
['张六' '男' 26]
['张七' '男' 27]
['张八' '男' 28]]
查看行数据与列数据
print("查看列数据\n%s"%train_data["姓名"])
print("\n查看行数据\n%s"%train_data[0:1])
#这里查看行时只能用连续索引的形式,如果是单索引(train_data[0])会报错
查看列数据
0 张一
1 张二
2 张三
3 张四
4 张五
5 张六
6 张七
7 张八
Name: 姓名, dtype: object
查看行数据
姓名 性别 年龄
0 张一 男 21
可以使用loc函数通过标签查看及选取数据
print(train_data)
姓名 性别 年龄
0 张一 男 21
1 张二 男 22
2 张三 男 23
3 张四 男 24
4 张五 男 25
5 张六 男 26
6 张七 男 27
7 张八 男 28
也可以使用iloc函数通过位置查看和选取数据,这也是小道最常用的取数据方式
tmp = train_data.iloc[0:2,0:2]
print("取前两行两列的数据\n%s"%tmp)
tmp = train_data.iloc[1,2]
print("\n取第二行的第3列的数据\n%s"%tmp)
取前两行两列的数据
姓名 性别
0 张一 男
1 张二 男
取第二行的第3列的数据
22
对数据的统计:describe函数
print("字符串信息统计\n%s"%train_data["姓名"].describe())
print("数值信息统计\n%s"%train_data["年龄"].describe())
print("count is "%train_data["年龄"].describe().count())
print("max num is "%train_data["年龄"].describe().max())
字符串信息统计
count 8
unique 8
top 张二
freq 1
Name: 姓名, dtype: object
数值信息统计
count 8.00000
mean 24.50000
std 2.44949
min 21.00000
25% 22.75000
50% 24.50000
75% 26.25000
max 28.00000
Name: 年龄, dtype: float64
count is
max num is
对列进行排序
print(train_data.sort_index(axis=1,ascending=True))
姓名 年龄 性别
0 张一 21 男
1 张二 22 男
2 张三 23 男
3 张四 24 男
4 张五 25 男
5 张六 26 男
6 张七 27 男
7 张八 28 男
train_data["年龄"].sort()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-65-7a17c7a44327> in <module>
----> 1 train_data["年龄"].sort()
~/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py in __getattr__(self, name)
5065 if self._info_axis._can_hold_identifiers_and_holds_name(name):
5066 return self[name]
-> 5067 return object.__getattribute__(self, name)
5068
5069 def __setattr__(self, name, value):
AttributeError: 'Series' object has no attribute 'sort'
缺失值的处理
在pandas中,缺失值处理也是常见问题。