Pandas
Series
Pandas Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型
Series 由索引(index)和列组成
创建
从列表创建
# 带索引的一列数据
s1 = pd.Series([1, 2, 3, 4, 5])
[out]:
0 1
1 2
2 3
3 4
4 5
dtype: int64
从 ndarray 创建
之前我们学习了 numpy,我们使用 np.arange() 函数来创建一个带索引的 Series 类型数据:
# 索引为 a b c d e
s2 = pd.Series(np.arange(5), index=['a', 'b', 'c', 'd', 'e'])
print(s2)
[out]:
a 0
b 1
c 2
d 3
e 4
dtype: int32
从字典创建
# 创建一个字典,用key来构成表的索引
[in]: temp_dict = {"name": "zhangsan", "age": 27, "tel": 10086}
# 字典数据直接传入data
[in]: s3 = pd.Series(temp_dict)
[in]: print(s3)
[out]:
name zhangsan
age 27
tel 10086
dtype: object
切片与索引
import numpy as np
import pandas as pd
s1 = pd.Series(np.arange(4),index=["a","b","c","d"])
# 索引
print(s1[0])
print(s1["a"]) # 像字典一样索引
#切片
print(s1[:3])
out:
0
0
a 0
b 1
c 2
dtype: int64
向量化操作-列相加、相乘
import numpy as np
import pandas as pd
s1 = pd.Series(np.arange(3),index=['a','b','c'])
# 对应位置相加
[in]: result1 = s2 + s2
[in]: print(result1)
[in]: print("-" * 50) # 分割线
[out]:
a 0
b 2
c 4
d 6
e 8
dtype: int32
--------------------------------------------------
# 对应位置相乘
[in]: result2 = s2 * s2
[in]: print(result2)
[in]: print("-" * 50) # 分割线
[out]:
a 0
b 1
c 4
d 9
e 16
dtype: int32
--------------------------------------------------
# 各个位置加2
[in]: result3 = s2 + 2
[in]: print(result3)
[out]:
a 2
b 3
c 4
d 5
e 6
dtype: int32
index 属性和 values 属性
通过 Series.index 查看索引, 通过 values 查看值
[in]: s = pd.Series(np.arange(5), index=list("abcde"))
[in]: print(s.index)
[out]:
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
[in]: print(s.values)
[out]:
[0 1 2 3 4]
DataFrame
类似于 excel 表 有行索引 列索引
pandas.DataFrame( data, index, columns, dtype, copy)
参数说明:
data:一组数据(ndarray、series, map, lists, dict 等类型)。
index:索引值,或者可以称为行标签。
columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
dtype:数据类型。
copy:拷贝数据,默认为 False。
创建
从列表创建
单个列表
[in]: data = [1, 2, 3, 4, 5]
[in]: df = pd.DataFrame(data)
[in]: print(df)
[out]:
0
0 1
1 2
2 3
3 4
4 5
嵌套列表创建
import numpy as np
import pandas as pd
data = [["xiaoming",12],["xiaohong",12],["xiaolan",14]]
s = pd.DataFrame(data,index=list("123"),columns=["Name","Age"])
print(s)
out
Name Age
1 xiaoming 12
2 xiaohong 12
3 xiaolan 14
从 字典创建
[in]: data = {'Name': ['xiaoming', 'zhangsan', 'lisi'], 'Age':[10, 11, 21]}
[in]: df = pd.DataFrame(data)
[in]: print(df)
[out]:
Name Age
0 xiaoming 10
1 zhangsan 11
2 lisi 21
查询/统计计算 数据
首先构建 符合标准正态的 随机数据
以下是传入二维数组
[in]: df = pd.DataFrame(np.random.randn(6,4), columns=list('ABCD')) # 正太分布随机数
[in]: print(df)
[out]:
A B C D
0 -0.865623 0.104258 1.270031 -0.497194
1 3.748685 -1.068945 -0.138821 -0.068492
2 0.331632 1.397363 -1.452206 0.280301
3 -0.370889 0.018017 -0.545934 1.278703
4 -0.568596 0.914634 -0.017826 -0.375882
5 -1.252650 -0.140955 -1.715116 -1.294911
也可以用字典的方式传入数据
以第一个正态分布的数据为例
查看首位数据
读取 指定 行列
import numpy as np
import pandas as pd
data = pd.DataFrame(np.random.randn(6,4),index=list("abcdef"),columns=list("ABCD"))
# 列 读取
print(data["A"]) #读取单列
print(data[["A","C"]]) #读取多列
# 行 读取
print(data[0:3]) #切片 读取 第0 1 2 行
print(data["a":"d"]) #索引 读取 a-d 行
print(data.loc["a"])# 查询单行
print(data.loc[["a","b"]]) # 查询多行
# 多行 多列 读取
print(data["a":"d"][["A","D"]]) # a-d行 A和D列 数据
print(data.loc[["a","b"],["A","B"]])
print(data.loc["a":"b","A":"B"])
print(data.loc[data.index[0:2],["A","B"]])
数据处理
排序
import numpy as np
import pandas as pd
data = [["xiaoming",16],["xiaohong",12],["xiaolan",14]]
s = pd.DataFrame(data,index=list("123"),columns=["Name","Age"])
# 按照数值排序 by:按照Age ascending:False 大到小排序
print(s.sort_values(by='Age',ascending=False))
print(s.sort_index(axis=1,ascending=True)) #索引 列从小到大排序
选择数据
import numpy as np
import pandas as pd
data = [["xiaoming",16,1234],["xiaohong",12,2345],["xiaolan",14,23452]]
s = pd.DataFrame(data,index=list("123"),columns=["Name","Age","number"])
print(s['Name']) #选择Name一列数据
print(s[0:2]) #选择第0-1行数据
print(s.iloc[0:2,1:3])#选择第0-1行 第1-2列的数据
print(s.iloc[[1,2],1:3]) #选择第二第三行 的第1-2列
print(s[s.Age>12]) #选择Age这一列中大于12的数据
修改、添加、转置 数据
import numpy as np
import pandas as pd
data = [["xiaoming",16,1234],["xiaohong",12,2345],["xiaolan",14,23452]]
s = pd.DataFrame(data,index=list("123"),columns=["Name","Age","number"])
print(s)
s.iloc[1,1]=15 #第二行第二列数据修改为15 需要数清楚第几行第几列
s.loc['2','Age']=18 #根据标签定位修改
s.Age[s.Age > 0] = 0 # 将Age列中 大于 0 的所有数据修改为 0
s["address"] = pd.Series(np.arange(3),index=list("123")) #新加一列数据
print(s.T) # 数据转置
快速综合统计结果:计数,均值,标准差,最大值,四分位数,最小值
合并
第一种:索引一样的前提下合并
res = pf.concat([df1,df2,df3],axis=0,ignore_index=True) #将数据竖向合并,并且更新索引值
第二种:索引不一样
res1 = pd.concat([df1,df2],join='outer',ignore_index=True)#相同索引值合并,不同索引值用NAN填充
res2 = pd.concat([df1,df2],join='inner',ignore_index=True)#删除不同索引值数据,合并相同索引值数据