Python Pandas基础操作详解
作者:冲浪的长颈鹿V 发布时间:2022-02-18 11:17:07
标签:Python,Pandas,基础
数据结构&Series:
'''
series {索引 + 数据} 形式
索引是自动生成的
'''
#通过 list 创建
s1 = pd.Series([1, 2, 3, 4, 5])
#通过np数组创建
arr1 = np.arange(10)
s2 = pd.Series(arr1)
#自定义索引
s2 = pd.Series(arr1, index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'])
#单独查看值或索引
print(s1.values)
print(s1.index)
#字典索引超出 会显示nan 值 不会像数组创建series一样报错
#通过字典来创建series 由于字典无序 所以每次打印顺序可能不同, 所以可以添加索引 保证顺序
dict1 = {'姓名': '李宁', '班级': '三班', '年龄': '22'}
print(dict1)
s3 = pd.Series(dict1, index=['姓名', '班级', '年龄', '性别'])
#判断values是否为空nan
print(s3.isnull())
#判断values是否不为空
print(s3.notnull())
#通过下标取数据
print(s3[1])
#通过标签名取数字
print(s3['姓名'])
#选取多个
print(s2[[1, 5]])
#切片取值
print(s2[1:4]) #索引切边 是 左闭右开
print(s2['b':'h']) #标签切片可以包含末端数据 如h
#bool索引取值
print(s2[s2>5])
#索引与数据的对应关系 不被 运算所影响
#name 属性
s2.name = '佳林' #数组对象名---values标题
s2.index.name = '字母表' #索引名 ---- index标题
#查看前三行
print(s2.head(3))
#查看后两行
print(s2.tail(2))
DataFrame的构建:
#构造多类型字典
data = {
'a': [1, 2, 3, 4],
'b': (5, 6, 7, 8),
'c': np.arange(9, 13)
}
frame = pd.DataFrame(data)
#查看行索引
print(frame.index)
#查看列索引
print(frame.columns)
#查看values
print(frame.values) #返回nparray类型的二维数组
#指定行索引
frame = pd.DataFrame(data, index=['A', 'B', 'C', 'D'])
#指定列行索引
frame = pd.DataFrame(data, index=['A', 'B', 'C', 'D'], columns=['a', 'b', 'c', 'd'])
#series构成的字典构造dataframe
pd1 = pd.DataFrame({'a': pd.Series(np.arange(5)),
'b': pd.Series(np.arange(3, 5))
})
#dataframe的每列元素类型必须统一
#通过字典构造的字典来构造dataframe(嵌套)
data1 = {
'a': {
'apple': '3.6',
'banan': '3.5'
},
'b': {
'apple': '3.6',
'banan': '3.5',
'red': '3.7',
'yellow': '3.8'
}
}
#最内层字典的key是index
#外层字典的key是columns
#通过二位数组来构造dataframe----默认columns和index都是0-n
arr1 = np.arange(12).reshape(3, 4)
print(arr1)
frame1 = pd.DataFrame(arr1)
#字典构造的列表 构造 dataframe
li = [{'apple': '3.6', 'orange': '2.5'}, {'apple': '4.8', 'orange': '2.8'}, {'apple': '2.4'}]
li_data = pd.DataFrame(li)
#Series构成的列表 构成dataframe
l2 = [pd.Series(np.random.rand(3)), pd.Series(np.random.rand(3))]
l2_data = pd.DataFrame(l2)
索引操作:
ps = pd.Series(range(5))
pd1 = pd.DataFrame(np.arange(9).reshape(3, 3),
index=['a', 'b', 'c'], columns=['A', 'B', 'C'])
#重新索引 reindex 创建一个符合新索引的新对象
ps2 = ps.reindex(['a', 'b', 'c', 'd', 'e'])
print(ps2) #因为新索引与之前的索引没有对应关系 所以values全为空!!!!
#dataframe行索引重建顺序调整
pd2 = pd1.reindex(['a', 'b', 'c', 'd'])
pd3 = pd1.reindex(columns= ['B', 'C', 'A', 'B'])
DataFrame基本操作:
np.random.seed(1)
pd1 = pd.DataFrame(np.random.randint(0, 10, size=(3, 5)), columns=['a', 'b', 'c', 'd', 'e'], index=['A', 'B', 'C'])
print(pd1)
#和numpy一样 进行转至 切片提取
# print(pd1.T)
print(pd1[:'B']['e']) #第一个或只有一个[]默认是行索引index 第二个[]是columns
#增加列
pd1['f'] = [5, 5, 5]
print(pd1)
#删除列
del(pd1['d'])
print(pd1)
#修改行索引名----只能赋值
1\直接赋值法
pd1.index = ['a', 'b'........]
2\自定义函数法
def test_map(x):
return x+'_ABC'
pd1.rename(index=test_map,inplace=True)
#修改列索引名
1\直接赋值
pd1.columns = []
2\用str进行广播操作 如整体去掉某符号
pd1.columns = pd1.columns.str.strip('$')
3\函数法
pd1.columns = pd1.columns.map(lambda x:x[1:])
4\rename属性
# 直接法(好处:也可只修改特定的列)----字典values替代key
df.rename(columns=('$a': 'a', '$b': 'b', '$c': 'c', '$d': 'd', '$e': 'e'}, inplace=True)
# 函数法
df.rename(columns=lambda x:x.replace('$',''), inplace=True)
#提取行、列的loc和iloc
#iloc是按索引位置提取
#loc是按标签提取
df.loc[:, 'a'] #提取a列
df.loc[:, ['a', 'c']] #提取ac列
df.loc[1] #提取行标签为1的行
df.iloc[1] #提取行位置为1的行也就是第二行
df.loc[:2] #提取多行
#loc没有左闭右开
df.loc[0:1, 'b'] #提取行索引0-1包括1 的‘b'列
df1.loc['a':'B', 'c':'d'] #按标签提取某范围的行列
#多条件
df[(df['a']<=2) & (df['b']>=5)]
df.loc[(df['a']<=2) & (df['b']>=5)]
# 或 条件 不能使用 or
df[(df['a']<=2) | (df['b']>=5)]
df.loc[(df['a']<=2) | (df['b']>=5)]
广播运算:
arr = np.arange(12).reshape(3, 4)
print(arr)
#广播 每一行都减去第一行
print(arr-arr[0])
#默认series的行索引 匹配的是dataframe的列索引
df1 = pd.DataFrame(np.arange(12).reshape(4, 3), index=['a', 'b', 'c', 'd'], columns=list('ABC'))
s3 = df1.iloc[0] #取第一行
print(s3)
print(df1 - s3)
#沿着列运算
print(df1.sub(s4, axis= 0))
索引增删改查:
#增
##series
ps[4] = 9
print(ps)
ps1 = pd.Series({'v': 's', 'f': 's'})
pss = ps.append(ps1) #append拼接 这个方法不会影响原有数据
##dataframe
###增加列
df['d'] = [9, 8, 9]
###插入
df.insert(0, 'M', 1) #在第0列插入M全为1
##高级标签索引--增加行loc
df.loc['q'] = 1
row = {'M': 's', 'a': 'b', 'b': 'w', 'c': 'w', 'd': 8}
dfnew = df.append(row, ignore_index=True) #ignore_index:如果设置为true,则无视表的index,直接合并,合并后生成新的index。
#删
del ps[0]
#del只能删除dataframe的列
del df['M']
#*******drop******删除轴上的数据
#dataframe删除行
print(df.drop(['S', 'W']))
#指定轴删除列
print(df.drop(['a', 'c'], axis=1))
ps = pd.Series(range(1, 5))
#改
ps[0] = 888
print(ps)
df.a = 6
#修改行数据
df.loc['S'] = 888
#修改单个元素
df.loc['D', 'b'] = 8848
字符串元素处理:
in:
data = {'a': 'aeac@qq.com', 'b': 'stevan@famil.com', 'c': 'asda@asd.com', 'd': np.nan}
data = pd.Series(data)
print(data)
print(data.isnull())
#字符串查找
print(data.str.contains('qq'))
#分割
print(data.str.split(r'@'))
print(data.str.findall(r'@'))
#切片
print(data.str[:5])
out:
a aeac@qq.com
b stevan@famil.com
c asda@asd.com
d NaN
dtype: object
a False
b False
c False
d True
dtype: bool
a True
b False
c False
d NaN
dtype: object
a [aeac, qq.com]
b [stevan, famil.com]
c [asda, asd.com]
d NaN
dtype: object
a [@]
b [@]
c [@]
d NaN
dtype: object
a aeac@
b steva
c asda@
d NaN
dtype: object
数据规整:
pd.merge(data1, data2, on= '按照哪一行合并', how = 'left或right或outer或inner')
pd.merge(df_obj5, df_obj6, how='outer', left_index=True, right_index=True)
pd.merge(df_obj3, df_obj4, left_on='key', right_index=True)
pd.concat([df1, df2], join='inner\outer', axis=1
stack 列索引在最外层 columns在内层 变成series
外层索引为index内层索引变成columns--unstack()
g = df1.groupby(by='fruit')
for name,group in g:
print(name)
print('-'*30)
print(group)
apple
------------------------------
fruit color price
0 apple red 8.5
3 apple cyan 7.8
banana
------------------------------
fruit color price
1 banana yellow 6.8
4 banana cyan 6.4
orange
------------------------------
fruit color price
2 orange yellow 5.6
#利用字典来获取具体分组名的dataframe
s = dict(list(df1.groupby(by='fruit')))
s['apple']
def diff(arr):
return arr.max() - arr.min()
df1.groupby(by='fruit')['price'].agg(diff)
来源:https://blog.csdn.net/weixin_51531943/article/details/120968388
0
投稿
猜你喜欢
- 使用apidoc管理RESTful风格Flask项目接口文档方法apidoc项目地址flask扩展包地址文档示例地址1.安装nodejssu
- 在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数。例如,定义一个 Pers
- 上一章节我们学习了如何生成 word 文档以及在文档行中添加各种内容,今天我们基于上一章节的内容进行添砖加瓦 —>
- 在我们平常使用Python进行数据处理与分析时,在import完一大堆库之后,就是对数据进行预览,查看数据是否出现了缺失值、重复值等异常情况
- 本文实例讲述了python异常处理用法。分享给大家供大家参考,具体如下:之前用Java的时候,在容易出错的地方我们经常使用try…catch
- 有多少次你在考虑怎样设置数据库时感到为难?其实,如果你在Linux上使用MySQL,就不会有这种情况了。在Linux上使用Webmin图形界
- 在CSS中,实现分栏布局有两种方法。第一种方法是使用四种CSS定位选项(absolute 、static、relative和fixed)中的
- Windows•安装lxml最好的安装方式是通过wheel文件来安装,http://www.lfd.uci.edu/~gohlke/pyth
- 使用tensorflow 训练模型时,我们可以使用 tensorflow自带的 Save模块 tf.train.Saver()来保存模型,使
- 本文实例讲述了python中sleep函数用法。分享给大家供大家参考。具体如下:Python中的sleep用来暂停线程执行,单位为秒#---
- 一. torch.cat()函数解析1. 函数说明1.1 官网:torch.cat(),函数定义及参数说明如下图所示:1.2 函数功能函数将
- 如何用Cookie进行登录验证?很简单,看看这两个文件:login.htm请注册登录随风起舞<FORM ACTION=&qu
- 本文是关于人物角色的一些简单介绍,感谢瑶芝同学提供的大力帮助! 人物角色(Personas)作为一种技术
- 在产品开发中,由UED发起的项目越来越多,但是现在的问题是很难为其设定商业价值的目标。如果没有明确的商业价值目标,很多公司根本没办法花大成本
- 本文实例讲述了php输出xml必须header的解决方法。分享给大家供大家参考。具体方法如下:问题描述:最近在做一个xml输出时发现我们直接
- 以下是SQL连接代码: 代码如下:Function Open_conn() dim Conn,Strconn&
- <?php session_start(); $_SESSION['username']="zhuzhao&
- sys模块:全称system,指的是解释器。常用操作,用于接收系统操作系统调用解释器传入的参数1、 sys.argv获取脚本传递的所有参数,
- 在做数据分析或者统计的时候,经常需要进行数据正态性的检验,因为很多假设都是基于正态分布的基础之上的,例如:T检验。在Python中,主要有以
- 有时候,我们需要将TensorFlow的模型导出为单个文件(同时包含模型架构定义与权重),方便在其他地方使用(如在c++中部署网络)。利用t