Pandas基础快速入门

1.初识Pandas

Pandas 是“Python的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据”,主要数据结构是 Series(一维数据)与 DataFrame(二维数据),这两种数据结构可以处理金融、统计、社会科学、工程等领域里的大多数典型用例。

2.数据结构

2.1 Series数据结构

1  
2  
3  
4  
5  
6  
7  
8  
9  

|

import numpy as np  
import pandas as pd  
  
s = pd.Series([1, 3, 5, np.nan, 6, 8])  
  
print(s)  
  
d = pd.Series([1, 3, 5, 7], index=['a', '1', 'c', 3])  
print(d)  
  

—|—

输出结果为:

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  

|

0    1.0  
1    3.0  
2    5.0  
3    NaN  
4    6.0  
5    8.0  
dtype: float64  
    
a    1  
1    3  
c    5  
3    7  
dtype: int64  
  

—|—

数据结构为Series([1, 3, 5, 6], index=[‘a’, ‘b’, ‘c’, ‘d’])。index默认结构为0、1、2、3……

从上面的运行结果可以看出,index后面的文本型结构’a’,必须加引号,否则会报错,而数字是否加引号虽不影响,单加不加引号,数据类型完全不同。

除了采用index外,还可以采用字典形式,如下:

1  
2  
3  
4  
5  
6  
7  
8  

|

import pandas as pd  
from pandas import Series,DataFrame  
  
d = {'a':1, 'b':2, 'c':3, 'd':4}  
  
x1 = Series(d)  
  
print(x1)  
  

—|—

输出结果为:

1  
2  
3  
4  
5  

|

a    1  
b    2  
c    3  
d    4  
dtype: int64  
  

—|—

2.2 DataFrame 数据结构

DataFrame可以理解为两个Series构成的数组结构,在语法上完全相同。

1  
2  
3  
4  
5  
6  
7  

|

import pandas as pd  
from pandas import Series,DataFrame  
  
data = {'列1':[1, 2, 3, 4], '列2':[5, 6, 7, 8], '列3':[0, 9, 6, 8]}  
df2 = DataFrame(data, index=['one', 'two', 'three', 'four'], columns=['列1', '列2', '列3'])  
  
print(df2)  
  

—|—

输出结果为:

1  
2  
3  
4  
5  

|

       列1  列2  列3  
one     1   5   0  
two     2   6   9  
three   3   7   6  
four    4   8   8  
  

—|—

2.3 导入和导出

Pandas 可以从xlsx, csv中导入数据,也可以输出数据为xlsx, csv。

1  
2  
3  
4  
5  

|

# 写入csv  
df.to_csv('foo.csv')  
  
# 读取csv  
pd.read_csv('foo.csv')  
  

—|—

3.数据清洗

3.1 删除

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  

|

import pandas as pd  
from pandas import Series,DataFrame  
  
data = {'列1':[1, 2, 3, 4], '列2':[5, 6, 7, 8], '列3':[0, 9, 6, 8]}  
df2 = DataFrame(data, index=['one', 'two', 'three', 'four'], columns=['列1', '列2', '列3'])  
  
# 数据删除使用drop()  
df2 = df2.drop(columns=['列1'])  
df2 = df2.drop(index=['one'])  
  
print(df2)  
  

—|—

3.2 去除重复的值

1  

|

df = df.drop_duplicates() #去除重复行  
  

—|—

3.3 重命名

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  

|

import pandas as pd  
from pandas import Series,DataFrame  
  
data = {'列1':[1, 2, 3, 4], '列2':[5, 6, 7, 8], '列3':[0, 9, 6, 8]}  
df2 = DataFrame(data, index=['one', 'two', 'three', 'four'], columns=['列1', '列2', '列3'])  
  
# 重命名使用rename(columns=new_names, inplace=True) 函数  
df2.rename(index={'one':'第1', 'two':'第2'}, inplace=True)  
  
print(df2)  
  

—|—

3.4 格式相关

使用astype转换格式

1  
2  
3  
4  
5  
6  
7  
8  

|

import pandas as pd  
from pandas import Series,DataFrame  
  
data = {'列1':[1, 2, 3, 4], '列2':[5, 6, 7, 8], '列3':[0, 9, 6, 8]}  
df2 = DataFrame(data, index=['one', 'two', 'three', 'four'], columns=['列1', '列2', '列3'])  
  
df2['列1'].astype('str')  
df2['列1'].astype(np.int64)  
  

—|—

去除数据之间的空格strip

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  

|

import pandas as pd  
from pandas import Series,DataFrame  
  
data = {'列1':[1, 2, 3, 4], '列2':[5, 6, 7, 8], '列3':[0, 9, 6, 8]}  
df2 = DataFrame(data, index=['one', 'two', 'three', 'four'], columns=['列1', '列2', '列3'])  
  
# 删除左右两边的空格  
df2['one'] = df2['one'].map(str.strip)  
  
# 删除左边的空格  
df2['one'] = df2['one'].map(str.lstrip)  
  
# 删除右边的空格  
df2['one'] = df2['one'].map.(str.rstrip)  
  
# 删除特殊的字符  
df2['one']=df2['one'].str.strip('$')  
  

—|—

大小写转换

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  

|

import pandas as pd  
from pandas import Series,DataFrame  
  
data = {'chinese':[1, 2, 3, 4], 'math':[5, 6, 7, 8], 'English':[0, 9, 6, 8]}  
df2 = DataFrame(data, index=['one', 'two', 'three', 'four'], columns=['chinese', 'math', 'English'])  
  
# 全部大写  
df2.columns = df2.columns.str.upper()  
  
# 全部小写  
df2.columns = df2.columns.str.lower()  
  
# 首字母大写  
df2.columns = df2.columns.str.title()  
  
print(df2)  
  

—|—

1  
2  
3  
4  
5  
6  
7  
8  

|

# 下面这两行代码也可以一行代码  
data = {'chinese':[1, 2, 3, 4], 'math':[5, 6, 7, 8], 'English':[0, 9, 6, 8]}  
df2 = DataFrame(data, index=['one', 'two', 'three', 'four'], columns=['chinese', 'math', 'English'])  
  
  
df2 = pd.DataFrame({'chinese':[1, 2, 3, 4],   
                     'math':[5, 6, 7, 8],  
                    'English':[0, 9, 6, 8]},index=['one', 'two', 'three', 'four'] )  
  

—|—

查找空值

查找空值使用

1  

|

df.isnull()  
  

—|—

3.5 apply 函数对数据进行清洗

@todo

4.数据分析

Pandas常用的统计函数用法和NumPy类似(资料来源极课时间|数据分析实战45讲),如下:

img

使用describe()函数可以输出所有的统计指标

1  
2  
3  
4  
5  
6  

|

import pandas as pd  
from pandas import Series,DataFrame  
  
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})  
  
print(df1.describe())  
  

—|—

输出结果如下:

1  
2  
3  
4  
5  
6  
7  
8  
9  

|

   data1  
count  5.000000  
mean   2.000000  
std    1.581139  
min    0.000000  
25%    1.000000  
50%    2.000000  
75%    3.000000  
max    4.000000  
  

—|—

5.数据表合并

比如下面两个数据表需要合并,使用的是merge()函数。

1  
2  

|

df1 = DataFrame({'name':['One', 'two', 'a', 'b', 'c'], 'data1':range(5)})  
df2 = DataFrame({'name':['one', 'Two', 'A', 'B', 'C'], 'data2':range(5)})  
  

—|—

5.1 基于指定列进行连接

1  
2  
3  
4  
5  
6  
7  
8  
9  

|

import pandas as pd  
from pandas import Series,DataFrame  
  
df1 = DataFrame({'name':['One', 'Two', 'a', 'b', 'c'], 'data1':range(5)})  
df2 = DataFrame({'name':['One', 'Two', 'A', 'B', 'C'], 'data2':range(5)})  
  
df3 = pd.merge(df1, df2, on='name')  
  
print(df3)  
  

—|—

输出结果

1  
2  
3  

|

name  data1  data2  
0  One      0      0  
1  Two      1      1  
  

—|—

5.2 inner内链接

相当于求两个DataFrame的交集。

1  
2  
3  
4  
5  
6  
7  
8  
9  

|

import pandas as pd  
from pandas import Series,DataFrame  
  
df1 = DataFrame({'name':['One', 'Two', 'a', 'b', 'c'], 'data1':range(5)})  
df2 = DataFrame({'name':['One', 'Two', 'A', 'B', 'C'], 'data2':range(5)})  
  
df3 = pd.merge(df1, df2, how='inner')  
  
print(df3)  
  

—|—

输出结果为

1  
2  
3  

|

  name  data1  data2  
0  One      0      0  
1  Two      1      1  
  

—|—

5.3 outer外链接

相当于求两个 DataFrame 的并集

1  
2  
3  
4  
5  
6  
7  
8  
9  

|

import pandas as pd  
from pandas import Series,DataFrame  
  
df1 = DataFrame({'name':['One', 'Two', 'a', 'b', 'c'], 'data1':range(5)})  
df2 = DataFrame({'name':['One', 'Two', 'A', 'B', 'C'], 'data2':range(5)})  
  
df3 = pd.merge(df1, df2, how='outer')  
  
print(df3)  
  

—|—

输出结果为:

1  
2  
3  
4  
5  
6  
7  
8  
9  

|

 name  data1  data2  
0  One    0.0    0.0  
1  Two    1.0    1.0  
2    a    2.0    NaN  
3    b    3.0    NaN  
4    c    4.0    NaN  
5    A    NaN    2.0  
6    B    NaN    3.0  
7    C    NaN    4.0  
  

—|—

5.4 left左链接

第一个 DataFrame 为主进行的连接,第二个 DataFrame 作为补充

1  
2  
3  
4  
5  
6  
7  
8  
9  

|

import pandas as pd  
from pandas import Series,DataFrame  
  
df1 = DataFrame({'name':['One', 'Two', 'a', 'b', 'c'], 'data1':range(5)})  
df2 = DataFrame({'name':['One', 'Two', 'A', 'B', 'C'], 'data2':range(5)})  
  
df3 = pd.merge(df1, df2, how='left')  
  
print(df3)  
  

—|—

输出结果为:

1  
2  
3  
4  
5  
6  

|

name  data1  data2  
0  One      0    0.0  
1  Two      1    1.0  
2    a      2    NaN  
3    b      3    NaN  
4    c      4    NaN  
  

—|—

5.5 right右链接

第二个 DataFrame 为主进行的连接,第一个 DataFrame 作为补充

1  
2  
3  
4  
5  
6  
7  
8  
9  

|

import pandas as pd  
from pandas import Series,DataFrame  
  
df1 = DataFrame({'name':['One', 'Two', 'a', 'b', 'c'], 'data1':range(5)})  
df2 = DataFrame({'name':['One', 'Two', 'A', 'B', 'C'], 'data2':range(5)})  
  
df3 = pd.merge(df1, df2, how='right')  
  
print(df3)  
  

—|—

输出结果为:

1  
2  
3  
4  
5  
6  

|

 name  data1  data2  
0  One    0.0      0  
1  Two    1.0      1  
2    A    NaN      2  
3    B    NaN      3  
4    C    NaN      4  
  

—|—

参考资料

Pandas中文网

极课时间|数据分析实战45讲-陈旸

ChangeLog

20201026 完成1-3.4

20201027 完成3.5-5