【python】pandas
文章目录
- 绘图功能
- ipython的数据展示长度
- 读取EXCEL
- 增删改
- 创建
- 排序
- 处理xlsx文件
- 边删除边遍历csv数据
- loc和iloc(index)
- 修改
- 插入
- 去重
- 删除
- pandas数据处理-聚合-查
- axis的理解
- 合并两个pd格式
- append
- concat
- merge
- 筛选操作
- where
- 聚合
- sort
- 1、sort_values
- 2、sort_index
- join
- rank
- 全部代码
- pandas-数据挖掘小函数集
- apply
- 标准化
- 类型转换
- 数学计算
- Categorical
- 转换数据类型
- pandas速度提升
- numpy
- 时间数据类型
- 循环
- 矢量化的操作
绘图功能
http://c.biancheng.net/pandas/plot.html
ipython的数据展示长度
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
pd.set_option('max_colwidth',200)
读取EXCEL
import xlrd
import os
import pandas as pd
wb = pd.DataFrame(pd.read_excel("file_name.xlsx"))
增删改
创建
1、创建空的DataFrame
column = ['a','b','c']
data = pd.DataFrame(columns=column)
2、利用数组创建
'''创建一个6行4列的数组'''
data = np.random.randn(6,4)
df=pd.DataFrame(data,columns=list('ABCD'),index=[i for i in range(6)])
df
排序
pd.sort_values("xxx",inplace=True)
pd.sort_values(["1","2","3","4"],inplace=True)
处理xlsx文件
import pandas as pd
data = pd.read_excel(io = '1.xlsx')
a = data.values
data = pd.DataFrame(a, columns = [str(i) for i in range(9)])
'''此时转化为了DataFrame格式'''
边删除边遍历csv数据
一边删除一边遍历,需要删除后重新建立索引
wea= pd.read_csv(path)
for i in range(wea.shape[0]):datee = str(wea.loc[i,'date']) #读取某一列if():#满足某个条件 wea.drop(wea.index[i],inplace=True)wea = wea.reset_index(drop = True) #删除后重新建立索引,否则不从0开始
也试过把索引遍历设置变量表示,跟着增加,但不如重置index方法更灵活
loc和iloc(index)
总结两个的用法:
数字代表行(因为也没有行名啊),loc指定列只能用“列名”, iloc指定列只能用数字,列的index;
import pandas as pd
import numpy as npN = 10
D = 4X = np.zeros((N, D))
print(X.shape[0])
for i in range(10):for j in range(4):X[i][j] = i+j
df = pd.DataFrame(X)
df.columns = ['1','2','3','4']
print(df.head())
#----------------------------loc------------------------------
print(df.loc[4,'1'],type(df.loc[4,'1']))
print('-------第4行--------')
print(df.loc[4])
print('-------第4列--------')
print(df.loc[:,'4'])
print('-------获取多行--------')
print(df.loc[4:7])
print('-------获取多行,某一列-------')
print(df.loc[4:7,'4'])
print('-------获取多行,多列-------')
print(df.loc[4:7,['3','4']])
#----------------------------iloc------------------------------
print(df.iloc[1][2])
print('-------第4行_1--------')
print(df.iloc[4:5],type(df.iloc[4:5]))
print('-------第4行_2--------')
print(df.iloc[4],type(df.iloc[4]))
print('-------第4列_只能通过数字索引第几列--------')
print(df.iloc[:,[3]])
print('-------某行某列一个数字--------')
print(int(df.iloc[1:2,3:4].values),type(df.iloc[1:2,3:4].values),type(int(df.iloc[1:2,3:4].values)))
print('-------多列--------')
print(df.iloc[:,3:4])
print('-------获取多行--------')
print(df.iloc[4:7])
print('-------获取多行,某一列-------')
print(df.iloc[4:7,[3]])
print('-------获取多行,多列-------')
print(df.iloc[4:7,2:4])
输出结果为:(左为loc,右为iloc)
修改
loc , iloc 都可以修改数据
print('------修改数据---------')
print(int(df.iloc[1:2,3:4].values),type(df.iloc[1:2,3:4].values),type(int(df.iloc[1:2,3:4].values)))
df.iloc[1][3] = 4.5
print(np.float64(df.iloc[1:2,3:4].values),type(df.iloc[1:2,3:4].values),type(np.float64(df.iloc[1:2,3:4].values)))
df.iloc[1]['4'] = 4.7
print(np.float64(df.iloc[1:2,3:4].values),type(df.iloc[1:2,3:4].values),type(np.float64(df.iloc[1:2,3:4].values)))
按照条件修改,速度快很多,比apply要快
index_a = df['bb'] == 15
df['rr'] = 0
df.loc[index_a,'rr'] = 1
7000000条数据修改比较速度:
条件筛选:1.5s
apply: 2.3s
插入
1、字典插入一行
row = {'imo':imo,'type_code':type_code,'age':age}
data.loc[total] = row
2、插入一列
pandas.insert(loc, columns, value):
loc要插入的位置、columns列名,value值
'''在第1列后插入一个P列'''
df.insert(1,'P',[0,1,2,3,4,5])
df
插入前后:
去重
df.drop_duplicates(subset=['A','B','C','D'],keep=False)
删除
drop(labels, axis=0, level=None, inplace=False)
lables:要删除数据的标签
axis:0表示删除行,1表示删除列,默认0
inplace:是否在当前df中执行此操作
'''删除第1,3,4行'''
df.drop([1,3,4],axis=0)
'''删除第A,D列'''
df.drop(['A','D'],axis=1)
可以注意到问题:index数值没有改变,而且返回的结果都是对原数据的修改,并没有改变原来结构。然后我们在输出一次df,会发现df和第一张图片是相同的!
如果真的删除的话,需要重新赋值,同时要注意类型,因为有的数据类型进行增删改查等操作之后,类型发生了改变!
'''此时是在原结构上进行的删除!'''
df.drop(['A','D'],axis=1,inplace=True)
但是索引的序列不会有改变,需要重建索引
df.index = [i for i in range(df.shape[0])]
pandas数据处理-聚合-查
http://shzhangji.com/cnblogs/2017/07/23/learn-pandas-from-a-sql-perspective/
先构建
import pandas as pd
import numpy as np
a = [1,2,3,4,5]
b = [11,2,13,4,15]
c = [1,11,3,4,25]
d = np.array([a,b,c])
df = pd.DataFrame(d,columns=['a','b','c','d','e'])
print(df)
axis的理解
合并两个pd格式
pandas.concat(objs, axis=0, join_axes=None, ignore_index=False)
objs:合并对象
axis:合并方式,默认0表示按列合并,1表示按行合并
ignore_index:是否忽略索引
append
合并两个pandas数据,列相同,然后
concat
'''按照行合并'''
df2 = df[['c','d']]
df3 = pd.concat([df,df2], axis = 0, sort=False, ignore_index=True)
print(df3)
df3 = pd.concat([df,df2], axis = 1, sort=False, ignore_index=True)
print(df3)
结果为:
axis = 0a b c d e
0 1.0 2.0 3 4 5.0
1 11.0 2.0 13 4 15.0
2 1.0 11.0 3 4 25.0
0 NaN NaN 3 4 NaN
1 NaN NaN 13 4 NaN
2 NaN NaN 3 4 NaN
axis = 1a b c d e c d
0 1 2 3 4 5 3 4
1 11 2 13 4 15 13 4
2 1 11 3 4 25 3 4
merge
'''按照字段左连接合并'''
e = ["2","6","35"]
df2 = pd.DataFrame(np.array([c[:3], e]).T, columns = ['c','E'])
df_merge = pd.merge(df, df2, on = 'c', how = 'left')
print("merge\n", df_merge)
'''left就是按照左边的为准'''
结果为:
a b c d E
0 1 1 1 1 2
1 2 12 12 5 6
2 3 13 3 3 35
3 4 1 1 34 2
4 5 15 25 23 NaN
筛选操作
where
df['c'] = df['c'].apply(int)
condition_1 = df['c'] > 5
condition_2 = df_merge['f'].isnull()
condition_3 = df_merge['f'].notnull()
print("where\n", df_merge[condition_1 & condition_2])
print("where\n", df_merge[condition_1 & ~condition_2])
print("where\n", df_merge[condition_1 & condition_3])
结果:
a b c d E
4 5 15 25 23 NaNa b c d E
1 2 12 12 5 6a b c d E
1 2 12 12 5 6
聚合
官方文档:https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html
聚合包含两部分,一是分组字段,二是聚合函数
---------------------------------------------------------多个字段---------------------------------------------------------
temp = df_merge.groupby(['b', 'c']).agg({'a': np.sum,'d': np.max
})
print("group\n", temp)
结果:
b c
1 1 14 34
12 12 2 5
13 3 3 3
15 25 5 23
---------------------------------------------------------单个字段---------------------------------------------------------
print(df_merge.groupby('b')['a'].agg(['min', 'max']))
结果:
b min max
1 1 4
12 2 2
13 3 3
15 5 5
---------------------------------------------------------分组迭代---------------------------------------------------------
grouped = df_merge.groupby(['b'])
for index_b, value in grouped:print("b =",index_b,"--index:",value.index, "\n",value)
print("direct get\n",grouped.get_group("13"))
b = 1 a b c d E
0 1 1 1 1 2
3 4 1 1 34 2
b = 12 a b c d E
1 2 12 12 5 6
b = 13 a b c d E
2 3 13 3 3 35
b = 15 a b c d E
4 5 15 25 23 NaN
直接获取该分组的结果a b c d E
2 3 13 3 3 35
sort
两种sort。sort_index的作用是啥呢?
1、sort_values
temp_df = df_merge.sort_values(by=['c', 'b'], ascending=False, inplace = False)
print(temp_df)
print(df_merge['b'].dtype)
df_merge['c'] = df_merge['c'].apply(int)
df_merge['b'] = df_merge['b'].apply(int)
temp_df = df_merge.sort_values(by=['c', 'b'], ascending=False, inplace = False)
print(temp_df)
print(df_merge['b'].dtype)
结果:
a b c d E
2 3 13 3 3 35
4 5 15 25 23 NaN
1 2 12 12 5 6
0 1 1 1 1 2
3 4 1 1 34 2
objecta b c d E
4 5 15 25 23 NaN
1 2 12 12 5 6
2 3 13 3 3 35
0 1 1 1 1 2
3 4 1 1 34 2
int64
2、sort_index
temp_df = df_merge.set_index('b').sort_index()
print(temp_df)
join
结果:
rank
结果:
全部代码
pandas-数据挖掘小函数集
apply
def func_1(x):if(x > 10):return 1else:return 0
def func_2(x):return x[0] + x[1]
'''单列apply'''
b['ww'] = b['aa'].apply(lambda x: func_1(x))
'''多列apply'''
b['pp'] = b.apply(lambda x: func_2(x))
标准化
from sklearn.preprocessing import StandardScaler
import pandas as pd
import numpy as np
scaler = StandardScaler()
a = [1,2,3,4,5]
b = [11,2,13,4,15]
c = [1,11,3,4,25]
d = np.array([a,b,c])
X = pd.DataFrame(d,columns=['a','b','c','d','e'])
print(X.head())
scaler.fit(X)
print(scaler.transform(X))
输出:
a b c d e
0 1 2 3 4 5
1 11 12 13 14 15
2 10 11 23 4 25[[-1.4083737 -1.4083737 -1.22474487 -0.70710678 -1.22474487][ 0.81537425 0.81537425 0. 1.41421356 0. ][ 0.59299945 0.59299945 1.22474487 -0.70710678 1.22474487]]
类型转换
data[["score"]] = data[["score"]].astype(float)
数学计算
1、补位
n = '23'
print(n.zfill(3))
输出为’023’ , 补为3位,前面补0
2、累加平方和
print(type(x))
x = pd.Series(b['aa'].values)
sta = np.cumsum(x ** 2) # 累加的平方和
print(sta)
Categorical
转换数据类型
从csv读取的时间,往往被object默认存放,比较浪费时间,我们首先将object格式转为datetime格式。
pandas速度提升
pandas处理数据实在太慢了,先提一提pandas的速,再去找其他大数据分布式吧
numpy
之前用一步步手写python计算pearson系数,速度无比慢,其实stats已封装好如此经典的计算,直接调用即可。
一些统计的计算可参考官方文档
时间数据类型
dataframe的数据类型都是object,但数据量大了之后发现用dataframe还是很慢。
从csv读出的数据还是object类型,如果将时间格式转为datetiime格式,会提高效率。
df['date_time'] = pd.to_datetime(df['date_time'],format='%d/%m/%y %H:%M')
循环
如果增加一列是依赖另一列的,比如特征有开始和结束,我们想计算花费的时间
我用的比较多的是apply函数。
def func(st, ed):return ed - st
df['cost'] = df.apply(lambda x: func(x['start], x['end']), axis = 1)
如果你使用.apply()获取10年的小时数据,那么你将需要大约15分钟的处理时间。
如果这个计算只是大型模型的一小部分,那么你真的应该加快速度。这也就是矢量化操作派上用场的地方。
矢量化的操作
.isin()
【python】pandas相关推荐
- 【Python】Pandas profiling 生成报告并部署的一站式解决方案
Pandas 库功能非常强大,特别有助于数据分析与处理,并为几乎所有操作提供了完整的解决方案.一种常见的Pandas函数是pandas describe.它向用户提供数据集所有特征的描述性统计摘要,尽 ...
- 【Python】Pandas基础:结构化数据处理
python:Pandas基础:结构化数据处理 目录: 文章目录 @[toc] 一 pandas及其重要性 二 pandas的数据结构介绍 1 Series 2 DataFrame 3 索引对象 三 ...
- 【Python】Pandas高效加载JSON文件
说明 Python使用Pandas解析JSON的方法有不少,这里使用高效率的 read_json ,但问题是必须符合一定的格式. 推荐阅读 Pandas-read_json官方文档 大佬文章--Pan ...
- 【Python】Pandas GroupBy 深度总结
今天,我们将探讨如何在 Python 的 Pandas 库中创建 GroupBy 对象以及该对象的工作原理.我们将详细了解分组过程的每个步骤,可以将哪些方法应用于 GroupBy 对象上,以及我们可以 ...
- 【Python】Pandas 数据类型概述与转换实战
在进行数据分析时,确保使用正确的数据类型是很重要的,否则我们可能会得到意想不到的结果或甚至是错误结果.对于 pandas 来说,它会在许多情况下自动推断出数据类型 尽管 pandas 已经自我推断的很 ...
- 【Python】Pandas中的宝藏函数-applymap
applymap的用法比较简单,会对DataFrame中的每个单元格执行指定函数的操作,虽然用途不如apply广泛,但在某些场合下还是非常有用的. applymap()是与map()方法相对应的专属于 ...
- pandas中如何选取某几列_【python】pandas中 loc amp; iloc用法及区别
在刚学习Python的时候,对于loc.iloc.at.iat.ix有点混乱,没有进行过整理和梳理.所以针对这几种用法进行一次案例的整理.本次优先整理loc和iloc SQL中的select是根据列的 ...
- 【Python】pandas模块操作大型数据集
pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的. Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具.pandas提供了大量能使我们 ...
- 【Python】pandas遍历读取excel文件,修改并保存(一)
code ide and lib version: python 2.7(64) pycharm 2018.1.4 xlrd 1.1. ...
- 【Python】Pandas实用技能,数据筛选query函数详细介绍
来源:Python数据之道 (ID:PyDataLab) 作者:阳哥 Pandas 可以说是 在Python数据科学领域应用最为广泛的工具之一. Pandas是一种高效的数据处理库,它以 datafr ...
最新文章
- 神经网络中的权重初始化常用方法
- 如何正确处理Android6.0+的运行时权限申请
- 王融(1979-),女,中国信息通信研究院互联网法律中心副主任、高级工程师...
- 梯度下降和导数的作用
- linux 文件权限 rwt,Linux下修改文件权限(所有权)
- 现在电脑的主流配置_主流级玩家 应该如何配置高性价比电脑
- thymeleaf 消息推送_SpringBoot整合WebSocket实现消息推送
- Quartus II 与ModelSim-Altera联合仿真PLL
- Java实现Unicode和中文相互转换
- 蚂蚁金服收购印度外卖APP?
- 5G云游戏革命风云已起,各方势力谁执牛耳
- java爬取双色球所有中奖号码历史数据
- web(蜘蛛网和网)
- Windows 7 Service Pack 1已发布:但是您应该安装它吗?
- Typora+PicGo+坚果云搭建个人云笔记系统
- mysql查询每个分组的最新数据
- 虚拟仪器项目实战——一个用Labview做的水位水温控制模拟系统
- 如何在电脑浏览器查看微信文章
- 511遇见易语言文本替换和子文本替换
- kindeditor4.1.10图片上传配置及使用说明