Pandas的使用

宋正兵 on 2020-10-26

原本是DataFrame的使用笔记,记着记着变多了就改成了Pandas。

天下苦 python 久已……开个玩笑,不论是在数据挖掘还是在实验代码编写的过程中,但凡涉及到使用 pandas 操作 .csv 文件我都得屁颠儿屁颠儿地面向互联网编程。查了用用了查,脑子不好使于是想着开一篇文章记录下来吧。

PS:更为详细的内容请查阅pandas的文档

DataFrame的使用

DataFrame的创建

创建空的DataFrame

1
df = pd.DataFrame()

pandas.DataFrame(data, index, columns, dtype, copy)

  • data:要传入的数据,包括 ndarray、series、map、lists、dict、constant 和另一个DataFrame
  • index和columns:行索引和列索引,格式 ['x1','x2']
  • dtype:每列的类型
  • copy:从input输入中拷贝数据,默认是false,不拷贝(没用过)

DataFrame选取特定行或者列

1
2
3
4
5
6
7
import pandas as pd
data = pd.DataFrame({'a':[1,2,3],'b':[4,5,6],'c':[7,8,9]})
Out[1]:
a b c
0 1 4 7
1 2 5 8
2 3 6 9

提取列

单列

1
2
3
4
5
6
data['a']
Out[2]:
0 1
1 2
2 3
Name: a, dtype: int64

多列

1
2
3
4
5
6
data[['a', 'b']]
Out[3]:
a b
0 1 4
1 2 5
2 3 6

使用 .loc 或者 .iloc 提取

第一个参数是行,第二个参数是列

  • .loc按标签提取
  • .iloc按位置索引提取
1
2
3
4
5
6
7
8
9
10
11
12
13
data.loc[:, 'a'] # 等价于data.iloc[:, 0]
Out[6]:
0 1
1 2
2 3
Name: a, dtype: int64

data.loc[:, ['a', 'b']] # 等价于data.iloc[:, [0, 1]]
Out[7]:
a b
0 1 4
1 2 5
2 3 6

提取行

提取行一般只能用 .loc 和 .iloc

提取一行

1
2
3
4
5
6
7
8
9
10
11
12
13
data.loc[1] # 标签索引
Out[8]:
a 2
b 5
c 8
Name: 1, dtype: int64

data.iloc[1] # 位置索引
Out[9]:
a 2
b 5
c 8
Name: 1, dtype: int64

提取多行

1
2
3
4
5
6
7
8
9
10
11
data.loc[:1]
Out[10]:
a b c
0 1 4 7
1 2 5 8

data.loc[[0,1]]
Out[11]:
a b c
0 1 4 7
1 2 5 8

行列一起使用

1
2
3
4
data.loc[0:1, 'b']
Out[12]:
0 4
1 5

按匹配条件提取多行

单条件

1
2
3
4
5
data[data['a']<=2]
Out[13]:
a b c
0 1 4 7
1 2 5 8

多条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 这两种用法得到的结果一致


# 与 条件 不能使用 and
data[(data['a']<=2) & (data['b']>=5)]
data.loc[(data['a']<=2) & (data['b']>=5)]
Out[14]:
a b c
1 2 5 8


# 或 条件 不能使用 or
data[(data['a']<=2) | (data['b']>=5)]
data.loc[(data['a']<=2) | (data['b']>=5)]
Out[15]:
a b c
0 1 4 7
1 2 5 8
2 3 6 9

DataFrame的插入

1
2
3
4
5
6
7
import pandas as pd
data = pd.DataFrame({'a':[1,2,3],'b':[4,5,6],'c':[7,8,9]})
Out[1]:
a b c
0 1 4 7
1 2 5 8
2 3 6 9

插入列

在末尾插入新列

1
2
3
4
5
6
data['d'] = None
Out[2]:
a b c d
0 1 4 7 None
1 2 5 8 None
2 3 6 9 None

插入多列

方法一:利用 pd.concat
1
2
3
4
5
6
pd.concat([data, pd.DataFrame(columns=list('de'))])
Out[3]:
a b c d e
0 1.0 4.0 7.0 NaN NaN
1 2.0 5.0 8.0 NaN NaN
2 3.0 6.0 9.0 NaN NaN
方法二:利用 reindex 来重排和增加列名
1
2
3
4
5
6
data.reindex(columns=list('abcde'))
Out[4]:
a b c d e
0 1 4 7 NaN NaN
1 2 5 8 NaN NaN
2 3 6 9 NaN NaN

重排,改变各列的相对位置,且保留原始列数值

1
2
3
4
5
6
data.reindex(columns=list('cdeab'))
Out[5]:
c d e a b
0 7 NaN NaN 1 4
1 8 NaN NaN 2 5
2 9 NaN NaN 3 6

插入行

loc( ) 函数可以定位行后,并直接赋值插入

1
2
3
4
5
6
data.loc[0] = [1, 2, 3]
Out[6]:
a b c
0 1 2 3
1 2 5 8
2 3 6 9

当不想改变原来行的值时,可以先将表格分开,添加行后再合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
df1 = data.loc[:0]
df2 = data.loc[1:]
df3 = pd.DataFrame({
'a' : [1],
'b' : [2],
'c' : [3]
})
data = df1.append(df3, ignore_index = True).append(df2, ignore_index = True)
Out[7]:
a b c
0 1 4 7
1 1 2 3
2 2 5 8
3 3 6 9

获取DataFrame的行数和列数

返回列数:

1
df.shape[1]

返回行数:

1
2
df.shape[0]
# 或者 len(df)

索引号的修改与重排列

1
2
3
4
5
6
7
import pandas as pd
data = pd.DataFrame({'a':[1,2,3],'b':[4,5,6],'c':[7,8,9]})
Out[1]:
a b c
0 1 4 7
1 2 5 8
2 3 6 9

修改列索引号

1
2
3
4
5
6
data.columns = ['d','e','f']
Out[2]:
d e f
0 1 4 7
1 2 5 8
2 3 6 9

重排列列索引号

1
2
3
4
5
6
data.reindex(columns=list('fed'))
Out[3]:
f e d
0 7 4 1
1 8 5 2
2 9 6 3

重置索引

方法一:

1
data.index = range(len(data))

方法二:

1
data = data.reset_index(drop=True)

常用统计方法

方法 作用
mean() 平均值
median() 中位数
max() 最大值
min() 最小值
sum() 求和
std() 标准差

此外,Series 类型独有的方法:argmax() 最大值的位置,argmin() 最小值的位置。

使用中的问题

DataFrame写入csv文件中文乱码

解决办法:添加参数 encoding="utf_8_sig"

1
df.to_csv(output_file, encoding="utf_8_sig")