栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python数据处理

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python数据处理

一、数组 1.创建

2.属性

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(相应的权重,数组)

2.文件操作

loadtxt()

3.其他函数 1)random

# 产生[-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’;加号标记:‘+’

4)创建图形对象

可以通过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)散点图

四、pandas 1.Series 类似于字典,但索引默认从0开始


如果标签中出现数值型数据,就不可以通过下标取值了

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参数控制是否修改原值

2.DataFrame 1)创建



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参数来更改

4)属性和方法





# 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


4.datetime

datatime模块重新封装了time模块,提供了更多接口、类:date、time、datetime、timedelta、tzinfo

1)data类


2)datetime类

3)timedelta类

可以方便的在日期上做天、小时、分钟等相关数据的运算

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()保留小数
2)缺失值
方法功能
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')
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1034403.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号