pandas 入门
pandas 集成了 numpy与matplotlib 两个工具包; 主要的两个对象:Series(一维数据),DataFrame(二维数据), 重点学习DataFrame的使用。
numpy == 1.18.2
pandas == 1.0.3
Python == 3.7
一、创建Series与DataFrame数据对象
import pandas as pd
import numpy as np
# pandas Series 一维数据
s = pd.Series([1,2,3,np.nan,123])
print(s)
# 时间 index 索引
dates = pd.date_range('2020-05-01', periods=5)
print(dates)
# pandas DataFrame 二维数据
a = pd.DataFrame(np.random.randn(5,1), index=dates, columns=['c1'])
b = pd.DataFrame(np.random.randn(5,2), index=dates, columns=['数量','价格'])
print(a)
print(b)
# 不指定 字段和索引
表 = pd.DataFrame(np.arange(12).reshape(3,4))
print(表)
# 字典生成 DataFrame 对象
stu= pd.DataFrame({"name": ["张三","李四","王五"],
"age": np.random.randint(1,100, size=3),
"class": "二班"
})
print(stu)
0 1.0
1 2.0
2 3.0
3 NaN
4 123.0
dtype: float64
DatetimeIndex(['2020-05-01', '2020-05-02', '2020-05-03', '2020-05-04',
'2020-05-05'],
dtype='datetime64[ns]', freq='D')
c1
2020-05-01 -1.231058
2020-05-02 -0.081396
2020-05-03 0.603540
2020-05-04 -0.275905
2020-05-05 -0.638174
数量 价格
2020-05-01 -0.825869 1.358116
2020-05-02 -1.813568 1.377512
2020-05-03 -0.562157 0.719284
2020-05-04 -0.850693 0.538530
2020-05-05 1.116333 0.448529
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
name age class
0 张三 48 二班
1 李四 45 二班
2 王五 1 二班
二、DataFrame的属性与方法
print(stu.index) # 索引
print(stu.columns) # 字段
print(stu.values) # DataFrame的值
print(stu.describe()) # 统计
print(stu.T) # 转置
print(stu.sort_index(axis=1, ascending=True)) # 列排序
print("行排序,ascending=False 倒序")
print(stu.sort_index(axis=0, ascending=False)) # 行排序
print("按照指定序列排序")
print(stu.sort_values(by='age', ascending=True)) # 指定字段排序
print(stu)
RangeIndex(start=0, stop=3, step=1)
Index(['name', 'age', 'class'], dtype='object')
[['张三' 48 '二班']
['李四' 45 '二班']
['王五' 1 '二班']]
age
count 3.000000
mean 31.333333
std 26.312228
min 1.000000
25% 23.000000
50% 45.000000
75% 46.500000
max 48.000000
0 1 2
name 张三 李四 王五
age 48 45 1
class 二班 二班 二班
age class name
0 48 二班 张三
1 45 二班 李四
2 1 二班 王五
行排序,ascending=False 倒序
name age class
2 王五 1 二班
1 李四 45 二班
0 张三 48 二班
按照指定序列排序
name age class
2 王五 1 二班
1 李四 45 二班
0 张三 48 二班
name age class
0 张三 48 二班
1 李四 45 二班
2 王五 1 二班
三、DataFrame对象数据的选择
数据的选择,可以根据行或者列的下标筛选,也可以使用label进行筛选。筛选后返回 Series 或者 DataFrame 类型的对象。
import pandas as pd
import numpy as np
dates = pd.date_range("2020-05-04", periods=3)
df = pd.DataFrame(np.arange(9).reshape((3,3)), index=dates, columns=["A","B","C"])
print(df)
A B C
2020-05-04 0 1 2
2020-05-05 3 4 5
2020-05-06 6 7 8
print("colums索引,取出一列")
print(df["A"])
a = df.A
print(a, type(a))
colums索引,取出一列
2020-05-04 0
2020-05-05 3
2020-05-06 6
Freq: D, Name: A, dtype: int32
2020-05-04 0
2020-05-05 3
2020-05-06 6
Freq: D, Name: A, dtype: int32 <class 'pandas.core.series.Series'>
print("切片形式")
print(df[0:2])
a = df[0:2]
print(a, type(a))
print(df["2020-05-04":"2020-05-05"])
切片形式
A B C
2020-05-04 0 1 2
2020-05-05 3 4 5
A B C
2020-05-04 0 1 2
2020-05-05 3 4 5 <class 'pandas.core.frame.DataFrame'>
A B C
2020-05-04 0 1 2
2020-05-05 3 4 5
print("loc函数,根据行列的label选值")
print(df.loc["2020-05-04"]) # 行索引
print("------------------")
print(df.loc["2020-05-04":"2020-05-05","A"]) # 行列索引
print("------------------")
print(df.loc["2020-05-04":"2020-05-05","A":"B"])
loc函数,根据行列的label选值
A 0
B 1
C 2
Name: 2020-05-04 00:00:00, dtype: int32
------------------
2020-05-04 0
2020-05-05 3
Freq: D, Name: A, dtype: int32
------------------
A B
2020-05-04 0 1
2020-05-05 3 4
print("pandas.iloc() 函数,根据行列位置选择")
print(df.iloc[0:1,1:2]) # 切片
print(df.iloc[[0,2],1:2]) # 枚举筛选
pandas.iloc() 函数,根据行列位置选择
B
2020-05-04 1
B
2020-05-04 1
2020-05-06 7
# 根据条件筛选
a = df > 2 # 逻辑比较,会返回一个DataFrame, 内容为bool
print(a, type(a))
print(df[a])
print(df[df.A > 1])
b = df.A >1
print(b, type(b))
print(df[df == 2])
A B C
2020-05-04 False False False
2020-05-05 True True True
2020-05-06 True True True <class 'pandas.core.frame.DataFrame'>
A B C
2020-05-04 NaN NaN NaN
2020-05-05 3.0 4.0 5.0
2020-05-06 6.0 7.0 8.0
A B C
2020-05-05 3 4 5
2020-05-06 6 7 8
2020-05-04 False
2020-05-05 True
2020-05-06 True
Freq: D, Name: A, dtype: bool <class 'pandas.core.series.Series'>
A B C
2020-05-04 NaN NaN 2.0
2020-05-05 NaN NaN NaN
2020-05-06 NaN NaN NaN
四、DataFrame的赋值
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(24).reshape((6,4)), columns=["a","b","c","d"])
print("原始数据")
print(df)
print("loc选择赋值")
df.loc[1, "a"] = np.nan
print(df)
print("iloc选择赋值")
df.iloc[1,3] = 13
print(df)
print("按条件赋值")
df[df > 20] = 200
print(df)
print("整列赋值")
df.c = 30
print(df)
原始数据
a b c d
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15
4 16 17 18 19
5 20 21 22 23
loc选择赋值
a b c d
0 0.0 1 2 3
1 NaN 5 6 7
2 8.0 9 10 11
3 12.0 13 14 15
4 16.0 17 18 19
5 20.0 21 22 23
iloc选择赋值
a b c d
0 0.0 1 2 3
1 NaN 5 6 13
2 8.0 9 10 11
3 12.0 13 14 15
4 16.0 17 18 19
5 20.0 21 22 23
按条件赋值
a b c d
0 0.0 1 2 3
1 NaN 5 6 13
2 8.0 9 10 11
3 12.0 13 14 15
4 16.0 17 18 19
5 20.0 200 200 200
整列赋值
a b c d
0 0.0 1 30 3
1 NaN 5 30 13
2 8.0 9 30 11
3 12.0 13 30 15
4 16.0 17 30 19
5 20.0 200 30 200
五、DataFrame 数据缺失值处理
当数据中存在缺失值时,即值等于 NaN,则可以选择丢掉改行或列,或者进行数据填充。
import pandas as pd
import numpy as np
df = pd.DataFrame([[1,3,5],[np.nan, 0, 8], [9,0,2]], columns=["a", "b","c"])
print(df)
a b c
0 1.0 3 5
1 NaN 0 8
2 9.0 0 2
# 判断是否存在缺失值
print(df.isnull())
print("------------")
print(df.isnull().any())
print("------------")
print(df.isnull().any().any())
print("------------")
print(np.any(df.isnull()== True)) # 可以省略 ==True
print(np.any(df.isnull()))
a b c
0 False False False
1 True False False
2 False False False
------------
a True
b False
c False
dtype: bool
------------
True
------------
True
True
a = df.dropna(axis=1, how="any") # 案列删除
print("按行删除")
print(a)
b = df.dropna(axis=0, how="any") # 按行删除
print("按列删除")
print(b)
print("按行删除 how=all 则必须全部为 nan才会删除")
c = df.dropna(axis=0, how="all") # 按行删除 how=all 则必须全部为 nan才会删除
print(c)
print("原数据不受影响")
print(df)
按行删除
b c
0 3 5
1 0 8
2 0 2
按列删除
a b c
0 1.0 3 5
2 9.0 0 2
按行删除 how=all 则必须全部为 nan才会删除
a b c
0 1.0 3 5
1 NaN 0 8
2 9.0 0 2
原数据不受影响
a b c
0 1.0 3 5
1 NaN 0 8
2 9.0 0 2
# 填充缺失值
a = df.fillna(value=100)
print(a)
print("原数据不变")
print(df)
a b c
0 1.0 3 5
1 100.0 0 8
2 9.0 0 2
原数据不变
a b c
0 1.0 3 5
1 NaN 0 8
2 9.0 0 2
六、pandas 数据的导入导出
import pandas as pd
import numpy as np
# 导入函数
# read_csv
# read_excel
# read_sql
# read_json
# read_html
# read_pickle
# 对应的导出函数
# to_csv
# to_excel
# to_json
# ...
# 从excel中导入
df = pd.read_excel("students.xlsx")
print(df)
name age class
0 张三 18 二班
1 李四 19 二班
2 王五 20 二班
3 赵六 18 二班
4 李狗蛋 19 NaN
# 处理缺失值
if np.any(df.isnull()==True):
df = df.dropna(axis=0)
print(df)
name age class
0 张三 18 二班
1 李四 19 二班
2 王五 20 二班
3 赵六 18 二班
b = df.index
print(len(b))
# 增加一行数据
a = df.append({"name":"小红","age":18, "class":"二班"}, ignore_index=True)
print(a)
print("原数据不变")
print(df)
a.to_excel("students2.xlsx") # 如果已经有表存在则会覆盖
4
name age class
0 张三 18 二班
1 李四 19 二班
2 王五 20 二班
3 赵六 18 二班
4 小红 18 二班
原数据不变
name age class
0 张三 18 二班
1 李四 19 二班
2 王五 20 二班
3 赵六 18 二班
七、DataFrame数据合并
# 可使用的函数 pd.concat()
# DataFrame.append()
# pd.merge()
import pandas as pd
import numpy as np
# columns 一样的合并
df1 = pd.DataFrame(np.random.randn(4,3), columns=["a","b","c"])
df2 = pd.DataFrame(np.arange(3).reshape(1,3), columns=["a","b","c"])
df3 = pd.DataFrame(np.ones((1,3))*8, columns=["a","b","c"])
print(df1)
print(df2)
print(df3)
res1 = pd.concat([df1,df2,df3], axis=0) # axis=0 按照行方向合并
res2 = pd.concat([df1,df2,df3], axis=0, ignore_index=True) # ignore_index=True 重新生成index
print(res1)
print(res2)
a b c
0 1.091629 1.579258 -0.023059
1 2.645556 0.768897 -1.165307
2 0.899328 0.466672 1.617765
3 0.448329 1.283554 0.584536
a b c
0 0 1 2
a b c
0 8.0 8.0 8.0
a b c
0 1.091629 1.579258 -0.023059
1 2.645556 0.768897 -1.165307
2 0.899328 0.466672 1.617765
3 0.448329 1.283554 0.584536
0 0.000000 1.000000 2.000000
0 8.000000 8.000000 8.000000
a b c
0 1.091629 1.579258 -0.023059
1 2.645556 0.768897 -1.165307
2 0.899328 0.466672 1.617765
3 0.448329 1.283554 0.584536
4 0.000000 1.000000 2.000000
5 8.000000 8.000000 8.000000
# columns 不一样时
df4 = pd.DataFrame(np.zeros((1,3)), columns=["a","b","g"]) # g 在 df1-3中没有
print(df4)
res = pd.concat([df3,df4], ignore_index=True) # 默认join="outer"
print("默认处理方式为 outer") # 保留全部的 columns 没有值的地方赋值为 NaN
print(res)
res2 = pd.concat([df3,df4],join="outer", ignore_index=True)
print("join=outer")
print(res2)
res3 = pd.concat([df3,df4], join="inner", ignore_index=True)
print("join=inner") # 与 mysql 中两种表的 inner join 是一致的, 取columns一样的数据合并
print(res3)
a b g
0 0.0 0.0 0.0
默认处理方式为 outer
a b c g
0 8.0 8.0 8.0 NaN
1 0.0 0.0 NaN 0.0
join=outer
a b c g
0 8.0 8.0 8.0 NaN
1 0.0 0.0 NaN 0.0
join=inner
a b
0 8.0 8.0
1 0.0 0.0
# axis = 1的合并
res = pd.concat([df1, df3, df4], axis=1)
print(df1)
print(df3)
print(df4)
# 将全部 index都处理,没有的赋值为 NaN
print(res)
a b c
0 1.091629 1.579258 -0.023059
1 2.645556 0.768897 -1.165307
2 0.899328 0.466672 1.617765
3 0.448329 1.283554 0.584536
a b c
0 8.0 8.0 8.0
a b g
0 0.0 0.0 0.0
a b c a b c a b g
0 1.091629 1.579258 -0.023059 8.0 8.0 8.0 0.0 0.0 0.0
1 2.645556 0.768897 -1.165307 NaN NaN NaN NaN NaN NaN
2 0.899328 0.466672 1.617765 NaN NaN NaN NaN NaN NaN
3 0.448329 1.283554 0.584536 NaN NaN NaN NaN NaN NaN
# DataFrame.append()
# append DataFrame
res1= df3.append(df4, ignore_index=True)
print(res1)
a b c g
0 8.0 8.0 8.0 NaN
1 0.0 0.0 NaN 0.0
# append Series
s1 = pd.Series([1,2,3], index=["a","b","c"])
print(s1)
res2 = df3.append(s1, ignore_index=True)
print(res2)
a 1
b 2
c 3
dtype: int64
a b c
0 8.0 8.0 8.0
1 1.0 2.0 3.0
# pandas.merge() 两个DataFrame合并
# how 的方式:inner(内连接)、outer(外链接)、left(左连接)、right(右连接)
print(df3)
print(df4)
res = pd.merge(df3,df4) # 默认merge
print(res)
print("how=outer")
res2= pd.merge(df3,df4, how="outer")
print(res2)
print("how=outer, on=a")
res2= pd.merge(df3,df4, on= "a", how="outer")
print(res2)
print("how=left")
res3= pd.merge(df3,df4, how="left")
print(res3)
print("how=left, on=a")
res4= pd.merge(df3,df4,how="left",on="a") # 与mysql 中的 left join on 一样
print(res4)
print("how=inner")
df5 = pd.DataFrame([[8.0,3,5],[1,0,9],[8.0,8.0,9]],columns=["a","b","g"])
print(df5)
res5= pd.merge(df3,df5, how="inner", on="a")# 与mysql 中的 inner join on 一样
print(res5)
a b c
0 8.0 8.0 8.0
a b g
0 0.0 0.0 0.0
Empty DataFrame
Columns: [a, b, c, g]
Index: []
how=outer
a b c g
0 8.0 8.0 8.0 NaN
1 0.0 0.0 NaN 0.0
how=outer, on=a
a b_x c b_y g
0 8.0 8.0 8.0 NaN NaN
1 0.0 NaN NaN 0.0 0.0
how=left
a b c g
0 8.0 8.0 8.0 NaN
how=left, on=a
a b_x c b_y g
0 8.0 8.0 8.0 NaN NaN
how=inner
a b g
0 8.0 3.0 5
1 1.0 0.0 9
2 8.0 8.0 9
a b_x c b_y g
0 8.0 8.0 8.0 3.0 5
1 8.0 8.0 8.0 8.0 9