0%

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
123
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