python可视化基础知识(pandas表格运算,包括DataFrame的变换、合并、融合、运算、导入与导出等)

本文详细介绍使用Python进行数据处理和可视化的实用技巧,涵盖数据表格变换、变量运算、排序、拼接、融合、分组操作及数据导入导出方法。通过具体示例展示如何利用pandas和numpy库高效管理数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python可视化基础知识

import pandas as pd
import numpy as np
#实现同一个cell输出多个结果
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

1.表格的变换

  • 使用plotine包绘图或者分组groupby()计算处理时,通常是使用一维数据列表的DataFrame.若导入的数据表格为二维数据列表则将其转为一维。
df = pd.DataFrame({'X':['A','B','C'],'2019':[1,4,6],'2020':[4,1,7]})
df
X20192020
0A14
1B41
2C67
df_melt = pd.melt(df,id_vars = 'X',var_name = 'year',value_name = 'value')
df_melt
Xyearvalue
0A20191
1B20194
2C20196
3A20204
4B20201
5C20207
  • 也可以用pivot_table()函数将一列根据变量展开为多行,从而一维表变成二维表
df_pivot = df_melt.pivot_table(index = 'X',columns = 'year',values = 'value')
df_pivot = df_pivot.reset_index()
df_pivot
yearX20192020
0A14
1B41
2C67

2.变量的变换

  • 有时候需要我们对DataFrame中的每个元素进行运算处理,从而产生新的行列并添加
df_melt['new_value'] = df_melt['value']*2
df_melt
Xyearvaluenew_value
0A201912
1B201948
2C2019612
3A202048
4B202012
5C2020714
  • 还可以使用多种方法,在这里大家可以按照需求随意发挥
df_melt['new_value2'] = df_melt.apply(lambda x:x['value']*2 if x['year']== '2019' else x['value'],axis = 1) 
df_melt
Xyearvaluenew_valuenew_value2
0A2019122
1B2019488
2C201961212
3A2020484
4B2020121
5C20207147

3.表格的排序

  • 对于向量,可以通过np.sort()进行排序,而对于DataFrame,可以使用sort_values()函数,根据DataFrame中的某一列数值对整个表排序
df_melt = pd.melt(df,id_vars = 'X',var_name = 'year',value_name = 'value')
dat_sort1 = df_melt.sort_values(by = 'value',ascending = True)#根据value字段升序排列
dat_sort2 = df_melt.sort_values(by = ['year','value'],ascending = False)#根据value、year字段降序排列
dat_sort1
dat_sort2#可以看看两者的区别
Xyearvalue
0A20191
4B20201
1B20194
3A20204
2C20196
5C20207
Xyearvalue
5C20207
3A20204
4B20201
2C20196
1B20194
0A20191

4.表格的拼接

df1 = pd.DataFrame(dict(x = ['a','b','c'],y = range(1,4)))
df2 = pd.DataFrame(dict(z = ['B','D','H'],g = range(3,6)))
df3 = pd.DataFrame(dict(x = ['g','d'],y = [2,5]))
#构建三个DataFrame
df1
df2
df3
xy
0a1
1b2
2c3
zg
0B3
1D4
2H5
xy
0g2
1d5
  • 有时候需要在已有数据的基础上,添加新的行/列,或者添加新的表格,可以通过pd.concat()或者append()函数实现
    • 数据框添加列或者横向添加表格
    • 数据框添加行或者纵向添加表格
dat_cbind = pd.concat([df1,df2],axis = 1)#横向添加
dat_rbind = pd.concat([df1,df3],axis = 0)#纵向添加
dat_cbind
dat_rbind
xyzg
0a1B3
1b2D4
2c3H5
xy
0a1
1b2
2c3
0g2
1d5
  • 也可以删除表格种的行列,通过drop()函数实现
df1.drop(labels = 'y',axis = 1,inplace = False)
x
0a
1b
2c

5.表格融合

  • 对于有的数据不能很好的保持一致性,不一致不能简单拼接,需要找到一个common key作为融合的依据,在表格的融合中,最常用的函数是pd.merge()
#DataFrame构造数据帧
df1 = pd.DataFrame(dict(x = ['a','b','c'],y = range(1,4)))
df2 = pd.DataFrame(dict(x = ['a','b','d'],z = range(3,6)))
df3 = pd.DataFrame(dict(g = ['a','b','d'],y = [2,5,3]))
df4 = pd.DataFrame(dict(x = ['a','b','d'],y = [1,4,2],z = [2,5,3]))
df1
df2
df3
df4
xy
0a1
1b2
2c3
xz
0a3
1b4
2d5
gy
0a2
1b5
2d3
xyz
0a12
1b45
2d23
#只保留左表所有数据,两个表格融合后不存在的值为NaN
dat_merge1 = pd.merge(left = df1,right = df2,how = 'left',on = 'x')
dat_merge1
xyz
0a13.0
1b24.0
2c3NaN
#只保留右表的所有数据
dat_merge2 = pd.merge(left = df1,right = df2,how = 'right',on = 'x')
dat_merge2
xyz
0a1.03
1b2.04
2dNaN5
#只保留两个表中公共部分的信息
dat_merge3 = pd.merge(left = df1,right = df2,how = 'inner',on = 'x')
dat_merge3
xyz
0a13
1b24
#保留两个表的所有信息
dat_merge4 = pd.merge(left = df1,right = df2,how = 'outer',on = 'x')
dat_merge4
xyz
0a1.03.0
1b2.04.0
2c3.0NaN
3dNaN5.0
#多列匹配,包括[x,y]
dat_merge5 = pd.merge(left = df1,right = df4,how = 'right',on =['x','y'])
dat_merge5
xyz
0a12
1b45
2d23
#根据两个表的不同列名进行合并
dat_merge6 = pd.merge(left = df2, right = df3, how = 'left',left_on = 'x',right_on = 'g')
dat_merge6
xzgy
0a3a2
1b4b5
2d5d3
#若要合并的两个表有同一个列名,但是值不同,合并时又都想保留下来,则进行一下suffixes操作
dat_merge7 = pd.merge(left = df1,right = df4,how = 'left',on = 'x',suffixes = ['.1','.2'])
dat_merge7
xy.1y.2z
0a11.02.0
1b24.05.0
2c3NaNNaN

6.表格的分组操作

#df.x包含不同类型的数据,有时候会需要分组操作、分类运算等
df = pd.DataFrame({'x':['A','B','C','B','C'],'2017':[1,4,5,7,9],'2018':[2,3,4,8,9],'2019':[3,4,1,2,7]})
df_melt = pd.melt(df,id_vars = ['x'],var_name = 'year',value_name = 'value')
df
df_melt
x201720182019
0A123
1B434
2C541
3B782
4C997
xyearvalue
0A20171
1B20174
2C20175
3B20177
4C20179
5A20182
6B20183
7C20184
8B20188
9C20189
10A20193
11B20194
12C20191
13B20192
14C20197
#按行求和:
df_rowsum = df[['2017','2018']].apply(lambda x:x.sum(),axis = 1)
#按列求和:
df_colsum = df[['2017','2018']].apply(lambda x:x.sum(),axis = 0)
df_rowsum
df_colsum
0     3
1     7
2     9
3    15
4    18
dtype: int64






2017    26
2018    26
dtype: int64
#DataFrame运算,单列或者多列
df['2017_2'] = df['2017'].apply(lambda x:x+2)
df['2018_2019'] = df.apply(lambda x:x['2018']+3*x['2019'],axis = 1)
df
x2017201820192017_22018_2019
0A123311
1B434615
2C54177
3B782914
4C9971130

6.1 分组操作

#按照year分组,然后求均值
df_group_mean1 = df_melt.groupby('year',as_index = False).mean()
df_group_mean1
yearvalue
020175.2
120185.2
220193.4
#按照year与x两列分组求均值
df_group_mean2 = df_melt.groupby(['x','year'],as_index = False).mean()
df_group_mean2
xyearvalue
0A20171.0
1A20182.0
2A20193.0
3B20175.5
4B20185.5
5B20193.0
6C20177.0
7C20186.5
8C20194.0

6.2分组聚合

  • aggregate()与groupby()可以实现SQL中的分组聚合运算(aggregate()函数也可以简写为agg())
df_group = df_melt.groupby(['x','year'],as_index = False).agg({'value':{np.mean,np.median}})
df_group
xyearvalue
meanmedian
0A20171.01.0
1A20182.02.0
2A20193.03.0
3B20175.55.5
4B20185.55.5
5B20193.03.0
6C20177.07.0
7C20186.56.5
8C20194.04.0

6.3分组运算与筛选

  • transform()函数可以结合groupby实现类似SQL的分组运算操作
  • filter()函数可以结合groupby实现SQL中分组筛选运算
df_melt['precentage'] = df_melt.groupby('x')['value'].transform(lambda x:x/x.sum())
df_melt#按照x的种类划分,并计算相关值的百分比
df_filter = df_melt.groupby('x').filter(lambda x:x['value'].mean()>4)
df_filter
xyearvalueprecentage
0A201710.166667
1B201740.142857
2C201750.142857
3B201770.250000
4C201790.257143
5A201820.333333
6B201830.107143
7C201840.114286
8B201880.285714
9C201890.257143
10A201930.500000
11B201940.142857
12C201910.028571
13B201920.071429
14C201970.200000
xyearvalueprecentage
1B201740.142857
2C201750.142857
3B201770.250000
4C201790.257143
6B201830.107143
7C201840.114286
8B201880.285714
9C201890.257143
11B201940.142857
12C201910.028571
13B201920.071429
14C201970.200000

7.数据导入与导出

  • 大部分时候导入外部保存的数据文件,再使用它绘制图表,下面介绍常见的三个格式:CSV\TXT\EXCEL文件
    • CSV格式数据。通过df = pd.read_csv(‘Data.csv’,sep = ‘,’,header = 0,index_col = None,encoding = ‘utf8’)读取数据,通过df.to_csv(‘Data.csv’,index = False,header = True)将数据存储为CSV格式,index = False忽略索引信息,若为 True 则输出文件第一列保留索引值
    • TXT格式数据。使用np.loadtxt()函数加载数据,需要注意TXT文本文件每一行必须含有相同数量的数据,delimiter表示分隔符,读取文件:df = pd.DataFrame(np.loadtxt(‘Data.txt’,delimiter = ‘,’)).使用np.savetxt(fname,X)将ndarry数据保存为TXT格式的文件
    • Excel格式数据。使用pd.read_excel(‘data.xlsx’,sheetname = ‘sheetname’,header = 0)读取,若数据不含列名则header = None.使用df.to_excel(excel_writer,sheet_name = ‘sheetname’,index = False)保存数据
  • 导入数据有时候存在缺失值,可以使用下列方法处理
    • 直接删除带NaN的行:df_NA1 = df.dropna(axis =0)
    • 使用最邻近元素填充NaN:df_NA2 = df.fillna(method = ‘ffill’)
    • 使用指定的数值替代NaN:df_NA3 = df.fillna(13)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值