a = np.arange(6).reshape(2, 3)
# 使用resize方法改变数组形状, 不够的地方通过循环补充
b = np.resize(a, (3, 3))
print(a)
print('更改之后:n', b)
'''
[[0 1 2]
[3 4 5]]
更改之后:
[[0 1 2]
[3 4 5]
[0 1 2]]
'''
3.切片
二、numpy
1.统计
通过axis=0 or 1 来进行行 or 列计算
平均数 mean()
中位数 median()
标准差 std()
方差 var()
最大值 max()
最小值 min()
求和 sum()
加权平均值 average(),其中包含一个weights(相应的权重,数组)
loadtxt()
# 产生[-5,5)的两块2行3列的随机生成整数
np.random.randint(-5, 5, size=(2, 2, 3))
'''
array([[[-5, 0, -3],
[ 0, -4, -4]],
[[ 0, -2, -2],
[-1, -4, 0]]])
'''
可以通过seed()控制随机种子
# 无论怎么运行输出的值始终保持不变 np.random.seed(1) print(np.random.randint(5)) print(np.random.randint(5)) ''' 3 4 '''2)数组的其他函数
操作不会改变原数组,需要重新接收才可以
x = np.arange(12).reshape(3, 4)
print('增加新元素:n', np.append(x, [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]], axis=1))
print('原数组:n', x)
'''
增加新元素:
[[ 0 1 2 3 1 2 3 4]
[ 4 5 6 7 1 2 3 4]
[ 8 9 10 11 1 2 3 4]]
原数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
'''
三、matplotlib
1.基本方法
解决图表中不显示中,同时还需要配合解决负号问题
# 设置中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决负号不显示问题 plt.rcParams['axes.unicode_minus'] = False ''' SimHei 中文黑体 Kaiti 中文楷体 LiSu 中文隶书 FangSong 中文仿宋 '''
可以通过title(fontsize=18)来改变标题大小,同样也可以plot(linewidth=5)来改变线条的粗细
1)xticks/yticks() x/y坐标轴# ticks可以坐标轴数量 通过label可以得到自己想要的坐标值 plt.xticks(ticks=range(0, 9, 2), labels=[1, 2, 3, 4, 5]) # 当前就会输出5个,并且由1,2,3,4,5代替
x = np.arange(2000, 2023).astype(np.str_) # 这里的np.str_很关键 print(x, len(x)) y = np.random.randint(50, 500, 23) plt.xticks(ticks=range(0, len(x), 2)) plt.plot(x, y)2)legend() 图例 3)text() 2.其他元素可视性 1)显示网格 plt.gird() 2)对坐标轴的操作 plt.gca()
x = np.arange(-50, 50)
y = x ** 2
plt.xticks(ticks=range(-50, 60, 10))
ax = plt.gca()
# 不需要右、上线条 right left top bottom
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 将坐标轴移动到中心位置
ax.spines['left'].set_position(('data', 0)) # 还有一个outward参数
# ax.spines['left'].set_position(('axes', 0.5)) axes范围在0.0-1.0之间
plt.plot(x, y)
3)图表的样式参数
颜色:蓝色-b;绿色-g;红色-r;青色-c;品红-m;黄色-y;黑色-k;白色-w 颜色也可以用16进制表示,如#FFFFFF
透明度:0-1范围
折线样式:实线:‘-’;虚线:‘- -’;点划线:‘-.’;虚线:‘:’
标记点:点标记:‘.’;圆圈:‘o’;X标记:‘X’;钻石标记:‘D’;六角标记:‘H’;正方形标记:‘s’;加号标记:‘+’
可以通过plt.figure().add_subplot()方式绘制子图
如果子图2标题显示在子图1里面,可以通过plt.tight_layout()解决
还可以通过 subplots() 方法创建子图,这也是通过返回区域对象设置,很多方法都是set_开头,例如set_title()设置标题
# 创建了一个2行2列的画布,由fig接收figure参数,axes接收具体是哪个画布
fig, axes = plt.subplots(2, 2)
x = np.arange(1, 5)
axes[0][0].plot(x, x ** x)
axes[0][0].set_title('square')
axes[0][1].plot(x, np.sqrt(x))
axes[0][1].set_title('sqrt')
axes[1][0].plot(x, np.exp(x))
axes[1][0].set_title('exp')
axes[1][1].plot(x, np.log10(x))
axes[1][1].set_title('log10')
# 处理标题遮挡
plt.tight_layout()
3.基本图形绘制
1)柱状图
countries = ['纳微', '德国', '中国', '美国', '瑞典']
plt.figure(figsize=(12,6))
# 对应金牌、银牌、铜牌
gold_medal = [16, 12, 9, 8, 8]
silver_medal = [8, 10, 4, 10, 5]
bronze_medal = [13, 5, 2, 7, 5]
# 设置位置
len_array = np.arange(len(countries))
width = 0.2
a = len_array
b = len_array + width
c = len_array + 2 * width
plt.bar(a,gold_medal, width=width, color='gold')
plt.bar(b,silver_medal, width=width, color='gray')
plt.bar(c,bronze_medal, width=width, color='red')
# 使横坐标移动到中间位置
plt.xticks(len_array + width, labels=countries, fontsize=14)
# 设置具体数值
for i in range(len(countries)):
# 垂直居底 水平居中
plt.text(a[i], gold_medal[i], gold_medal[i], va='bottom', ha='center')
plt.text(b[i], silver_medal[i], silver_medal[i], va='bottom', ha='center')
plt.text(c[i], bronze_medal[i], bronze_medal[i], va='bottom', ha='center')
# 设置图例
plt.legend(['金牌', '铜牌', '银牌'])
plt.show()
2)饼图
3)散点图
如果标签中出现数值型数据,就不可以通过下标取值了
x = pd.Series({'a':1, 1: 2, 'b': 4})
x[0] # 报错,但是可以通过x[1]取出2,其他1和4必须通过x['a']和x['b']的方式取出
# 可以通过index指定索引下标 data = np.arange(3) s = pd.Series(data, index=[100, 101, 102]) ''' 100 0 101 1 102 2 dtype: int32 '''
# 当指定索引不能和字典健匹配时,索引补充NAN
d = {'a': 1, 'b': 2, 'c': 3}
s = pd.Series(d, index=['a', 'd', 'e'])
'''
a 1.0
d NaN
e NaN
dtype: float64
'''
# 可以通过[[]]方式访问多个元素 s[['a', 'b', 'c']] ''' 1 2 3 '''
head() 查看前几条数据,默认5条
tail() 查看后几条数据,默认5条
reindex() 重新索引,可以通过fill_value参数来添加缺失值
drop() 删除,通过inplace参数控制是否修改原值
data = [
['abc', 10],
['def', 20],
['hij', 30]
]
df = pd.DataFrame(data, columns=['name', 'value'])
df
'''
name value
0 abc 10
1 def 20
2 hij 30
'''
data = [
{'a': 1, 'b': 2},
{'a': 2, 'b': 3, 'c': 4},
]
df = pd.DataFrame(data, index=['first', 'second'])
df
'''
a b c
first 1 2 NaN
second 2 3 4.0
'''
# 使用Series创建DataFrame
# 可以通过这种方式 设置每列不同数据类型
data = {
'Name': pd.Series(['yjy', 'zah', 'qjw', 'dk']),
'Age': pd.Series([22, 22, 23, 23], dtype=int),
'gender': pd.Series(['男', '男', '男', '男']),
'salary': pd.Series([600, 4500.5, 600, 780.4], dtype=float)
}
df = pd.DataFrame(data)
df
'''
Name Age gender salary
0 yjy 22 男 600.0
1 zah 22 男 4500.5
2 qjw 23 男 600.0
3 dk 23 男 780.4
'''
2)添加/删除列
df['add'] = pd.Series([1, 2, 3]) df['add2'] = df['Age'] + df['salary'] df ''' Name Age gender salary add add2 0 yjy 22 男 600.0 1 622.0 1 zah 22 男 4500.5 2 4522.5 2 qjw 23 男 600.0 3 623.0 3 dk 23 男 780.4 NaN 803.4 '''
insert() 方法添加
df = pd.DataFrame([[1, 2], [5, 6]], index=['first', 'second'], columns=['one', 'two']) df.insert(1, column='add', value=[4, 5]) # 添加到哪列,列名,列值 df ''' one add two first 1 4 2 second 5 5 6 '''
del 和 pop() 都可以删除列,其中pop()有返回值
3)处理行需要通过loc() 属性来完成,全部使用的是标签索性
iloc() 全部使用的位置索引
df.loc['first'] ''' one 1 add 4 two 2 Name: first, dtype: int64 '''
# 还可以读取指定行、列 df.loc['first', 'one'] ''' 1 '''
df[:1] # 可以,用切片的方式可以直接使用位置索引 df[1] # 不可以
data = {'one': 3, 'add': 4}
df = df.append(pd.Series(data, name='add'))
df
'''
one add two
first 1.0 4.0 2.0
second 5.0 5.0 6.0
add 3.0 4.0 NaN
'''
# df = df.append(data, ignore_index=True)
# 下面这种方式会把原来的索引值变成0 1 2
使用drop() 方法删除行,需要接收,或者通过inplace=True参数来更改
# first行升序, add行降序 df.sort_values(axis=1, by=['first', 'add'], ascending=[True, False], inplace=True) df # 实际上最后一个add行并没有降序排序 ''' one two add first 1.0 2.0 4.0 second 5.0 6.0 5.0 add 3.0 NaN 4.0 '''3.time
datatime模块重新封装了time模块,提供了更多接口、类:date、time、datetime、timedelta、tzinfo
1)data类
可以方便的在日期上做天、小时、分钟等相关数据的运算
from datetime import date, datetime, timedelta, tzinfo
dt = datetime.now() # 获得当前时间
print(type(dt), dt.strftime('%Y-%m-%d %X'))
dt_yesterday = dt + timedelta(days= -1) # 昨天
dt_tomorrow = dt + timedelta(days= 1) # 明天
print(dt_yesterday.strftime('%Y-%m-%d %X'))
print(dt_tomorrow.strftime('%Y-%m-%d %X'))
4)时间转化
# 将复数形式转化为datetime格式
df = pd.DataFrame({'year': [2022, 2018], 'month': [9, 9], 'day': [2, 7]})
pd.to_datetime(df)
'''
0 2022-09-02
1 2018-09-07
dtype: datetime64[ns]
'''
# 通过origin设置起始时间
pd.to_datetime([1, -2, 3], unit='D', origin=pd.Timestamp('2022-8-4'))
'''
DatetimeIndex(['2022-08-05', '2022-08-02', '2022-08-07'], dtype='datetime64[ns]', freq=None)
'''
5)生成时间戳范围
这里的periods是要输出多少个日期
pd.date_range(start='2022-8-4', end='2022-8-6', periods=4)
'''
DatetimeIndex(['2022-08-04 00:00:00', '2022-08-04 16:00:00',
'2022-08-05 08:00:00', '2022-08-06 00:00:00'],
dtype='datetime64[ns]', freq=None)
' ''
5.数据的读取和存储
1)读取
| 方法 | 文件类型 |
|---|---|
| read_csv() | 读取CSV文件 |
| read_excel() | 读取EXCEL文件 |
| read_json() | 读取JSON文件 |
| read_table() | 读取TXT文件 |
| 参数 | 功能 |
|---|---|
| nrows | 顺序读取指定行数 |
| skiprows | 指定读取哪些行 |
| usecols | 指定读取哪些列 |
| index_col | 指定索引 |
| names | 设置标题名称 |
| keep_default_na | 将缺失值标记为NA |
| na_values | 指定缺失值的表述方式 |
| na_filter | 不处理缺失值 |
| dtype | 设置数据类型 |
| chunksize | 每次读取多少行 |
# 读取前20行数据
data = pd.read_csv('某招聘网站数据.csv', nrows=20)
# 跳过前20行
data = pd.read_csv('某招聘网站数据.csv', skiprows=[i for i in range(0, 20)])
# 读取当前目录下 某招聘网站数据.csv 文件中全部偶数行
data = pd.read_csv('某招聘网站数据.csv', skiprows=lambda x: x % 2)
# 指定列,可以用列索引也可以用列名
data = pd.read_csv('某招聘网站数据.csv', usecols=[0, 2, 4])
# 指定索引
data = pd.read_csv('某招聘网站数据.csv', index_col='positionId')
# 将 positionId、positionName、salary 列,并将标题设置为 ID、岗位名称、薪资
data = pd.read_csv('某招聘网站数据.csv', usecols=[0, 1, 17], names=['ID', '岗位名称', '薪资'])
# 将缺失值标记为 NA
data = pd.read_csv('某招聘网站数据.csv', keep_default_na=False)
# 将[]标记为缺失值
data = pd.read_csv('某招聘网站数据.csv',na_values=['[]'])
# 不处理缺失值
data = pd.read_csv("某招聘网站数据.csv",na_filter=False)
# 将 positionId,companyId 设置为字符串格式
data = pd.read_csv('某招聘网站数据.csv', dtype={'positionId': str,'companyId':str})
# 返回一个可迭代对象,每次读取 10 行
data = pd.read_csv("某招聘网站数据.csv", chunksize= 10)
2)存储
# 且只保留positionName、salary两列
data.to_csv('./outdata/33.csv', columns=['positionName', 'salary'], encoding='utf-8')
# 取消每一行的索引
data.to_csv('./outdata/34.csv', index=False, encoding='utf-8')
6.数据预览与处理
1)查看
做为DataFrame的补充
| 方法 | 功能 |
|---|---|
| sample() | 随机查看数据,默认为1条 |
| describe() | 查看 数值型 列的统计信息 |
| round() | 保留小数 |
| 方法 | 功能 |
|---|---|
| isnull() | 识别缺失值。可以配合sum()查看缺失值数目 |
| dropna() | 删除缺失值。axis接收0/1判断是行/列删除,how表示删除形式(all 全部为缺失值时才删除,默认为any 只要有就删除),subset表示去重的行/列(默认为None,所有行列),inplace是否在原数据上操作 |
| fillna() | 替换缺失值。method接收string(取bfill时用下一个非缺失值来填充,ffill用上一个),limit限制填充个数 |
# df是存放数据的参数名
# 每列具体由多少缺失值
print(df.isnull().sum())
# 缺失值所在的行并增量
df[df.isnull().T.any() == True].style.highlight_null(null_color='skyblue'))
# 删除缺失值
df.dropna()
# 缺失值替换为 *
df.fillna('*')
# 对于评分列的缺失值处理,我们可以用上一个电影的评分进行填充
df['评分'].fillna(axis=0,method='ffill')
# 将评价人数列的缺失值,用整列的均值进行填充
df['评价人数'].fillna(df['评价人数'].mean())
# 评价人数列的缺失值,用上下数字的均值进行填充
df['评价人数'].fillna(df['评价人数'].interpolate())
3)重复值
# 重复值所在的行筛选出来 df[df.duplicated()] # 根据某列查找重复值 df[df.duplicated(['导演'])] # 删除全部的重复值,但保留最后一次出现的值 # first保留第一个,默认为False全部删除 df.drop_duplicates(keep = 'last')



