使用python做基本的数据处理

1.常用的基本数据结构

元组、列表、字典、集合、常用的序列函数

1.1基本操作

1.1.1 元组:逗号分开的序列值。

tup = tuple (4,5,6)

tup = (4,5,6) #推荐

tup = 4,5,6

(4,5,6)

虽然对象元组中存储的对象自身是可以改变的,但是元组一旦创建,各个位置上的对象是无法被修改的。

tup = (4,5,[2,4],6)

(4,5,[2,4],6)

tup[2][1] = 3 # 这样的操作是可以的

tup[2] = [2,3] # 直接修改是不可行的

1.1.2 列表:长度可变,内容可变的list

基本操作:

a_list = [1,2,3,None] # 初始化

a_list = list((4,5,6)) # 使用list关键字

a_list.append(7) #添加单个item

a_list.extend([8,9,10]) #添加一串list

a_list + b_list # 也可以用+,copy但是不建议使用,效率低

a_list.remove(10) #移除某一个字符

a_list.insert(1,2) #在具体位置插入item

a_list.pop(2) #弹出某一个位置的item

a_list.sort() #做排序

切片操作: a_list[start:stop:step]

  • 起始位置start索引是包含的,结束位置stop索引并不包含。
  • 切出来的元素数量是stop - start
  • start 和 stop 可以省略,默认是起始位置和结束位置
  • 负索引就是从尾部开始数
  • 当step为负数时,步长就是反方向移动,如a_list[::-1]

内建序列函数:

  • enumrate 增加当前元素的索引

    for index,value in enumrate(a_list)

        print(index)
  • zip 将列表或者元组的元素配对,成为新的列表

    print(list(zip([1,2],[3,4])))

    [(1,3),(2,4)]
  • reversed 逆序操作

    同[::-1]
  • sorted 排序操作

    sorted([7,2,1,3])

    [1,2,3,7]

1.1.3 字典 又叫哈希表,关联数组

初始化:a_dict = {'a':'some value','b':1}

基本操作:

a_dict['a'] # some value

a_dict.get('a') # some value

a_dict.get('c','default value') # 取不到值时,可以取默认值

del a_dict['a'] # 删除某个键值对

ret = a_dict.pop('a') # 弹出某个键值对

a_dict.update(b_dict) # 将两个dict合二为一

list(a_dict.keys()) # ['a','b']

list(a_dict.values()) # ['some value',1]

tup = (('a','some value'),('b',1))

b_dict = dict(tup)# {'a': 'some value', 'b': 1}

1.1.4 set 一种无序且元素唯一的容器

初始化:a_set = set([1,2,2,3,4,6]) # {1,2,3,4,6}

基本操作:

a_set = {1,2,3,4}

b_set = {4,5,6,7}

a.union(b) # 1,2,3,4,5,6,7 并集

a|b # 1,2,3,4,5,6,7 并集

a.intersection(b) # 4 交集

a & b # 4 交集

2.列表、集合、字典推导式

他允许你过滤一个容器的元素,用一种简明的表达式转换传递给过滤器的元素,从而生成一个新的列表。

表达式 :[expr for val in collection if condition]

strings = ['a','b','as','bat','car','dove','python']

b_list = [x.upper() for x in strings if len(x) > 2]

['BAT', 'CAR', 'DOVE', 'PYTHON']

eg1:strings = ['a','b','as','bat','car','dove','python'],生成一个字典,key为strings的元素,value是元素的长度。

c_dict = {x:len(x) for x in strings }

eg2:strings = ['a','bat','as','bat','car','dove','python'],生成一个集合,value是元素的长度。

d_set = {len(x) for x in strings }

eg3:strings = ['a','bat','as','bat','car','dove','python'],生成一个字典,key为strings的元素,value是元素的字符列表。

e_dict = {x:[y for y in x] for x in strings }

3.pandas常用方法

pandas两种常用的数据结构:

  • Series:包含键值对的一维数据结构。 它类似于 python 字典。
  • Dataframe:是一种二维数据结构,它基本上是两个或多个Series的组合。可以理解成value是[] 它们也可以被认为是数据的电子表格,是我们最常用的数据结构。

data1 = {'state': ['Ohio'], 'year': ['1988'], 'pop': ['1.7']}

data1_sr = pd.Series(data1)

  state    [Ohio]
year [1988]
pop [1.7]
dtype: object

data2 = {'state': ['Ohio', 'Ohio', 'Nevada'], 'year':['1988', '1964', '1955'], 'pop': ['1.7', '2.5', '3.3']}

data_df = pd.DataFrame(data)

      state  year  pop
0 Ohio 1988 1.7
1 Ohio 1964 2.5
2 Nevada 1955 3.3

3.1 DataFrame 取值的方法

df3 = pd.DataFrame(data, columns=['year', 'state', 'pop'], index=['a', 'b', 'c'])

print(df3.year)

print(df3['year']['a']) # 只支持[列][行]

print(df3.loc['a']['year']) # 支持[行][列]

print(df3.columns) # 索引类型都是不可变数组

  Index(['year', 'state', 'pop'], dtype='object')

print(df3.index) # 索引类型都是不可变数组

  RangeIndex(start=0, stop=3, step=1)

3.2 关于index 的一些方法

obj = pd.Series([4.5, 2.3, 4.6, 2.3], index=['b', 'a', 'd', 'c'])

  b    4.5
a 2.3
d 4.6
c 2.3

obj = obj.drop('a') # 删除a行

  b    4.5
d 4.6
c 2.3

obj = obj.reindex(['b', 'a', 'd', 'c', 'e'])

  b    4.5
a NaN
d 4.6
c 2.3
e NaN

data = {'state': ['Ohio', 'Ohio', 'Nevada'], 'year': ['1988', '1964', '1955'], 'pop': ['1.7', '2.5', '3.3']}

df = pd.DataFrame(data)

      state  year  pop
0 Ohio 1988 1.7
1 Ohio 1964 2.5
2 Nevada 1955 3.3

df = df.drop(columns='year', axis=1) # drop 删除索引

      state  pop
0 Ohio 1.7
1 Ohio 2.5
2 Nevada 3.3

3.2 常用的方法

3.2.1 deepcopy & copy

data = {'state': ['Ohio', 'Ohio', 'Nevada'], 'year': ['1988', '1964', '1955'], 'pop': ['1.7', '2.5', '3.3']}

df = pd.DataFrame(data)

df2 = df.copy(False)

df3 = df.copy(True)

df2['state'][0] = 'Nevada'

print(df)

   state  year  pop
0 Ohio 1988 1.7
1 Ohio 1964 2.5
2 Nevada 1955 3.3

print(df2) # 浅copy会变化

     state  year  pop
0 Nevada 1988 1.7
1 Ohio 1964 2.5
2 Nevada 1955 3.3

print(df3) # 深copy则不会变化

      state  year  pop
0 Ohio 1988 1.7
1 Ohio 1964 2.5
2 Nevada 1955 3.3

3.2.2 用set_index修剪索引 + to_dict 转成可用的dict

df = pd.DataFrame({"month": [2, 6, 12, 10], "year": [2008, 2012, 2012, 2019], "day": [29, 30, 31, 31]})

df2 = df.set_index("year") # 原来的索引被删除了,year变成索引

print(df2)

        month  day
year
2008 2 29
2012 6 30
2012 12 31
2019 10 31

df2 = df.set_index("year", drop=False) # 原来的索引被删除了,year也可以不用删除

print(df2)

        month  year  day
year
2008 2 2008 29
2012 6 2012 30
2012 12 2012 31
2019 10 2019 31

info_dict = df2.to_dict('index')# 会报错,有两个2012,ValueError: DataFrame index must be unique for orient='index'.

df2 = df.set_index(['year', 'month'], drop=False) # 用两个值做索引

print(df2)

              month  year  day
year month
2008 2 2 2008 29
2012 6 6 2012 30
12 12 2012 31
2019 10 10 2019 31

info_dict = df2.to_dict('index')

print(info_dict)

  {(2008, 2): {'month': 2, 'year': 2008, 'day': 29}, (2012, 6): {'month': 6, 'year': 2012, 'day': 30}, (2012, 12): {'month': 12, 'year': 2012, 'day': 31}, (2019, 10): {'month': 10, 'year': 2019, 'day': 31}}

print(info_dict.get((2012, 6)))

  {'month': 6, 'year': 2012, 'day': 30}

3.2.3 使用apply 函数操作数据

df = pd.DataFrame([[4, 9]] * 3, columns=['A', 'B'])

print(df)

     A  B
0 4 9
1 4 9
2 4 9

df2 = df.apply(lambda x: pd.Series([x[1], x[0]], index=['foo', 'bar']), axis=1)

print(df2)

     foo  bar
0 9 4
1 9 4
2 9 4

3.2.4 isna 和 isin 通过分离 NaN 或定义数据所在的范围来过滤数据。

df3 = df2.isin([9, 4])

print(df3)

      foo   bar
0 True True
1 True True
2 True True

df = pd.DataFrame({'num_legs': [2, 4], 'num_wings': [2, 0]}, index=['falcon', 'dog'])

print(df)

        num_legs  num_wings
falcon 2 2
dog 4 0

df2 = df.apply(lambda x: pd.Series([x[1], pd.NA], index=['foo', 'bar']), axis=1)

print(df2)

          foo   bar
falcon 2 <NA>
dog 0 <NA>

print(df2.isna().sum())

  foo    0
bar 2
dtype: int64

3.2.5 merge方法

df1 = pd.DataFrame({'lkey': ['foo', 'bar', 'baz', 'foo'], 'value': [1, 2, 3, 5]})

df2 = pd.DataFrame({'rkey': ['foo', 'bar', 'baz', 'foo'], 'value': [5, 6, 7, 8]})

print(df1.merge(df2, left_on='lkey', right_on='rkey'))

    lkey  value_x rkey  value_y
0 foo 1 foo 5
1 foo 1 foo 8
2 foo 5 foo 5
3 foo 5 foo 8
4 bar 2 bar 6
5 baz 3 baz 7

使用python做基本的数据处理的更多相关文章

  1. 使用Python做简单的字符串匹配

    由于需要在半结构化的文本数据中提取一些特定格式的字段.数据辅助挖掘分析工作,以往都是使用Matlab工具进行结构化数据处理的建模,matlab擅长矩阵处理.结构化数据的计算,Python具有与matl ...

  2. 1.2 Why Python for Data Analysis(为什么使用Python做数据分析)

    1.2 Why Python for Data Analysis?(为什么使用Python做数据分析) 这节我就不进行过多介绍了,Python近几年的发展势头是有目共睹的,尤其是在科学计算,数据处理, ...

  3. Python做简单的字符串匹配详解

    Python做简单的字符串匹配详解 由于需要在半结构化的文本数据中提取一些特定格式的字段.数据辅助挖掘分析工作,以往都是使用Matlab工具进行结构化数据处理的建模,matlab擅长矩阵处理.结构化数 ...

  4. 使用python做科学计算

    这里总结一个guide,主要针对刚开始做数据挖掘和数据分析的同学 说道统计分析工具你一定想到像excel,spss,sas,matlab以及R语言.R语言是这里面比较火的,它的强项是强大的绘图功能以及 ...

  5. 12岁的少年教你用Python做小游戏

    首页 资讯 文章 频道 资源 小组 相亲 登录 注册       首页 最新文章 经典回顾 开发 设计 IT技术 职场 业界 极客 创业 访谈 在国外 - 导航条 - 首页 最新文章 经典回顾 开发 ...

  6. [原创博文] 用Python做统计分析 (Scipy.stats的文档)

    [转自] 用Python做统计分析 (Scipy.stats的文档) 对scipy.stats的详细介绍: 这个文档说了以下内容,对python如何做统计分析感兴趣的人可以看看,毕竟Python的库也 ...

  7. 这几天有django和python做了一个多用户博客系统(可选择模板)

    这几天有django和python做了一个多用户博客系统(可选择模板) 没完成,先分享下 断断续续2周时间吧,用django做了一个多用户博客系统,现在还没有做完,做分享下,以后等完善了再慢慢说 做的 ...

  8. 用python做中文自然语言预处理

    这篇博客根据中文自然语言预处理的步骤分成几个板块.以做LDA实验为例,在处理数据之前,会写一个类似于实验报告的东西,用来指导做实验,OK,举例: 一,实验数据预处理(python,结巴分词)1.对于爬 ...

  9. 《用Python做HTTP接口测试》学习感悟

    机缘巧合之下,报名参加了阿奎老师发布在"好班长"的课程<用Python做HTTP接口测试>,报名费:15rmb,不到一杯咖啡钱,目前为止的状态:坚定不移的跟下去,自学+ ...

  10. python做量化交易干货分享

    http://www.newsmth.NET/nForum/#!article/Python/128763 最近程序化交易很热,量化也是我很感兴趣的一块. 国内量化交易的平台有几家,我个人比较喜欢用的 ...

随机推荐

  1. LeetCode-911 在线选举

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/online-election 题目描述 给你两个整数数组 persons 和 times .在选 ...

  2. EF Core自动将实体映射到数据库

    protected override void OnModelCreating(ModelBuilder modelBuilder) { try { var compilationLibrary = ...

  3. Java后台校验手机号和邮箱

    //true是手机号,false不是手机号 public static boolean checkPhone(String phone){ Pattern p = Pattern.compile(&q ...

  4. el-dialog 遮罩层覆盖内容的问题

    页面组件层级太多,就会出现遮罩层覆盖dialog里面内容的问题 解决:  :append-to-body="true" 把遮罩层添加到body上面    用z-index 设置没效 ...

  5. Filters in ASP.NET Core(Net6之过滤器)

    Filters in ASP.NET Core 如果觉得样式不好:跳转即可 (md文件复制过来有些样式会不一样) 原文地址:https://lifengying.site/archives/net6% ...

  6. java 实现Excel导入导出功能

    本文记录 首先需要准备一个导入模板的实体类 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn ...

  7. MySQL(2): 窗口函数\备份与恢复\性能优化\权限管理

    mysql 8.0 新增了窗口函数,与Oracle一样的 MySQL从8.0开始支持窗口函数,这个功能在大多商业数据库和部分开源数据库中早已支持,有的也叫分析函数. 什么叫窗口? 窗口的概念非常重要, ...

  8. 快速替换jar包class文件的方法

    stetp1:jar -tvf *.jar | grep *.class 查找jar包中,class文件所在的具体路径stetp2:jar -xvf *.jar */*/*/*.class 当前目录下 ...

  9. Pytest之生成allure报告

    一.前戏 在之前我们已经学会使用 pytest-html 插件生成 html 格式的测试报告: 1 # 第一步,安装插件 2 pip install pytest-html 3 ​ 4 # 第二步,执 ...

  10. ADE-XL bsub提交超时

    查找命令行log, Fatal server error: could not open default font 'fixed' 解决方案: yum install 'xorg-x11-font*'