pandas三个核心的数据类型:
Series
– 数据系列 – 表示一维的数据DataFrame
– 数据框、数据窗、数据表 – 表示二维的数据(表格)index
– 索引 – 为Series
和DataFrame
对象提供索引服务
# 创建Series对象(方法一)
ser1 = pd.Series(data=[420, 380, 500, 520, 230], index=[f'{x}季度' for x in '一二三三四'])
ser1
一季度 420
二季度 380
三季度 500
三季度 520
四季度 230
dtype: int64
# 创建Series对象(方法二)
ser2 = pd.Series(data={
'一季度':420,
'二季度':380,
'三季度':520,
'四季度':500
})
ser2
一季度 420
二季度 380
三季度 520
四季度 500
dtype: int64
# 切片
ser1['二季度':'三季度']
二季度 380
三季度 500
三季度 520
dtype: int64
# 花式索引
ser1[['一季度', '二季度', '一季度']]
一季度 420
二季度 380
一季度 420
dtype: int64
# 布尔索引
ser1[ser1 > 400]
一季度 420
三季度 500
三季度 520
dtype: int64
# 获得描述性统计信息
ser1.describe()
print(ser1.sum())
print(ser1.mean())
print(ser1.std())
print(ser1.var())
print(ser1.median())
# 极差
print(np.ptp(ser1))
# 众数
print(ser1.mode()[0])
# 判断元素是第一次出现还是重复出现 -- 布尔数组
ser3.duplicated()
# 去重(保留最后一项,默认保留第一项)
ser3.drop_duplicates(keep='last')
# keep参数
# first -- 保留第一项,last -- 保留最后一项,False -- 重复的项一律不保留
ser3.drop_duplicates(keep=False)
# 去重(获得独一无二的元素数据构成的数组)
ser3.unique()
# 查看不重复元素的个数
ser3.nunique()
# 统计每个数据重复的次数
ser3.value_counts()
# 判断空值
ser3.isnull()
# 判断非空值
ser3.notnull()
# 删除空值
# ser3.dropna(inplace=True)
# inplace -- 是否是直接修改原数据
ser3.dropna()
# 填充空值
ser3.fillna('orange')
# 用前一个元素填充空值
ser3.fillna(method='ffill')
# 用后一个元素填充空值
ser3.fillna(method='bfill')
# 把满足条件的数据保留,不满足条件的数据替换
ser4.where(ser4 > 30, 30)
# 把满足条件的数据替换,不满足条件的数据保留
ser4.mask(ser4 > 30, 30)
# 对ser1中的数据进行线性归一化
x_max, x_min = ser1.max(), ser1.min()
ser1.apply(lambda x: (x - x_min) / (x_max - x_min))
# 对ser1中的数据进行零均值归一化
mu, sigma = ser1.mean(), ser1.std()
ser1.apply(lambda x: (x - mu) / sigma)
# 值最大的三个,可以解决topN问题
ser1.nlargest(3)
# 值最小的两个
ser1.nsmallest(2)
DataFrame
# 创建DataFrame的第一种方式(基于二维数组)
df = pd.DataFrame(
data = np.random.randint(60, 101, (5, 3)),
index = np.arange(1001, 1006),
columns = ['语文', '数学', '英语']
)
df
语文 数学 英语
1001 74 67 86
1002 86 83 66
1003 85 93 60
1004 69 85 78
1005 71 68 85
# 创建DataFrame的第二种方式(基于字典)
scores = {
'语文': [62, 72, 93, 88, 93],
'数学': [95, 65, 86, 66, 87],
'英语': [66, 75, 82, 69, 82],
}
df2 = pd.DataFrame(data=scores, index=np.arange(1001, 1006))
df2
# 创建DataFrame的第三种方式
# 读取CSV文件
# read_csv函数的几个重要参数
# ~ delimiter / sep : 分隔符(默认是英文的逗号)
# ~ nrows: 读取的行数
# ~ skiprows: 跳过哪些行
# ~ usecols: 指定读取哪些列
# ~ index_col: 编码(解决乱码现象)
df3 = pd.read_csv(
r'data/2018年北京积分落户数据.csv',
delimiter=',',
index_col='id',
usecols=['id', 'name', 'score'],
nrows=10,
skiprows=np.arange(1, 11)
)
df3
# 创建DataFrame的第四种方式(读取Excel文件)
df4 = pd.read_excel(
'data/小宝剑大药房(犀浦店)2018年销售数据.xlsx',
header=1,
nrows=20,
sheet_name='工作表1'
)
df4
import pymysql
# 创建DataFrame的第五种方式(从MySQL数据库读取数据)
conn = pymysql.connect(
host='47.104.31.138',port=3306,
user='guest',password='Guest.618',
database='hrs',charset='utf8mb4'
)
df5 = pd.read_sql('select dno, dname, dloc from tb_dept', conn)
df5
df6 = pd.read_sql(
'select eno, ename, job, mgr, sal, comm, dno from tb_emp',
con = conn,
index_col='eno'
)
df6
# 把两个表连成一个表
pd.merge(
df6,
df5,
on='dno',
how='inner'
)