文章目录

  • 绘图功能
  • 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的理解

axis的重点在于方向,而不是行和列。
当axis=1时,如果是求平均,那么是从左到右横向求平均;如果是拼接,那么也是左右横向拼接;如果是drop,那么也是横向发生变化,体现为列的减少。
考虑了方向,即axis=1为横向,axis=0为纵向,而不是行和列。

合并两个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相关推荐

  1. 【Python】Pandas profiling 生成报告并部署的一站式解决方案

    Pandas 库功能非常强大,特别有助于数据分析与处理,并为几乎所有操作提供了完整的解决方案.一种常见的Pandas函数是pandas describe.它向用户提供数据集所有特征的描述性统计摘要,尽 ...

  2. 【Python】Pandas基础:结构化数据处理

    python:Pandas基础:结构化数据处理 目录: 文章目录 @[toc] 一 pandas及其重要性 二 pandas的数据结构介绍 1 Series 2 DataFrame 3 索引对象 三 ...

  3. 【Python】Pandas高效加载JSON文件

    说明 Python使用Pandas解析JSON的方法有不少,这里使用高效率的 read_json ,但问题是必须符合一定的格式. 推荐阅读 Pandas-read_json官方文档 大佬文章--Pan ...

  4. 【Python】Pandas GroupBy 深度总结

    今天,我们将探讨如何在 Python 的 Pandas 库中创建 GroupBy 对象以及该对象的工作原理.我们将详细了解分组过程的每个步骤,可以将哪些方法应用于 GroupBy 对象上,以及我们可以 ...

  5. 【Python】Pandas 数据类型概述与转换实战

    在进行数据分析时,确保使用正确的数据类型是很重要的,否则我们可能会得到意想不到的结果或甚至是错误结果.对于 pandas 来说,它会在许多情况下自动推断出数据类型 尽管 pandas 已经自我推断的很 ...

  6. 【Python】Pandas中的宝藏函数-applymap

    applymap的用法比较简单,会对DataFrame中的每个单元格执行指定函数的操作,虽然用途不如apply广泛,但在某些场合下还是非常有用的. applymap()是与map()方法相对应的专属于 ...

  7. pandas中如何选取某几列_【python】pandas中 loc amp; iloc用法及区别

    在刚学习Python的时候,对于loc.iloc.at.iat.ix有点混乱,没有进行过整理和梳理.所以针对这几种用法进行一次案例的整理.本次优先整理loc和iloc SQL中的select是根据列的 ...

  8. 【Python】pandas模块操作大型数据集

    pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的. Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具.pandas提供了大量能使我们 ...

  9. 【Python】pandas遍历读取excel文件,修改并保存(一)

    code ide and lib version: python            2.7(64) pycharm            2018.1.4 xlrd            1.1. ...

  10. 【Python】Pandas实用技能,数据筛选query函数详细介绍

    来源:Python数据之道 (ID:PyDataLab) 作者:阳哥 Pandas 可以说是 在Python数据科学领域应用最为广泛的工具之一. Pandas是一种高效的数据处理库,它以 datafr ...

最新文章

  1. 神经网络中的权重初始化常用方法
  2. 如何正确处理Android6.0+的运行时权限申请
  3. 王融(1979-),女,中国信息通信研究院互联网法律中心副主任、高级工程师...
  4. 梯度下降和导数的作用
  5. linux 文件权限 rwt,Linux下修改文件权限(所有权)
  6. 现在电脑的主流配置_主流级玩家 应该如何配置高性价比电脑
  7. thymeleaf 消息推送_SpringBoot整合WebSocket实现消息推送
  8. Quartus II 与ModelSim-Altera联合仿真PLL
  9. Java实现Unicode和中文相互转换
  10. 蚂蚁金服收购印度外卖APP?
  11. 5G云游戏革命风云已起,各方势力谁执牛耳
  12. java爬取双色球所有中奖号码历史数据
  13. web(蜘蛛网和网)
  14. Windows 7 Service Pack 1已发布:但是您应该安装它吗?
  15. Typora+PicGo+坚果云搭建个人云笔记系统
  16. mysql查询每个分组的最新数据
  17. 虚拟仪器项目实战——一个用Labview做的水位水温控制模拟系统
  18. 如何在电脑浏览器查看微信文章
  19. 511遇见易语言文本替换和子文本替换
  20. kindeditor4.1.10图片上传配置及使用说明

热门文章

  1. 庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术
  2. 年轮计算机,基于年轮参数的树木科属计算机识别方法研究
  3. 毕业设计(四)-- 指针式仪表读数
  4. 状压dp概念和使用技巧
  5. Java最简洁加密32位MD5
  6. 统计栅格数据内的矢量点的属性
  7. 土拨鼠网站日记管理(分析推送二合一)】宝塔插件之自动爬取全站URL推送说明书
  8. 网页初学者,如何使用VS2005搭建编程环境(JavaScript及ASP调试)
  9. QSR International Nvivo 12新功能展示及使用
  10. 日志监控——A模块(windows)