f2dad3c2f6ba659fccc6e6d68e3b433d.gif

作者 | 老表

来源 | 简说Python

今天给大家分享几个自己近期常用的Pandas数据处理技巧,主打实用,所以你肯定能用的着,建议扫一遍,然后收藏起来,下次要用的时候再查查看即可。

  • 简单说说

  • 总结分享

  1. 统计一行/一列数据的负数出现的次数

  2. 让dataframe里面的正数全部变为0

  3. 统计某列中各元素出现次数

  4. 修改表头和索引

  5. 修改列所在位置insert+pop

  6. 常用查询方法query

  7. 数据存储时不要索引

  8. 按指定列排序sort_values

  9. apply 函数运用

  10. Pandas数据合并

  11. Pandas Dataframe拷贝

  12. 对于列/行的操作

简单说说

Panda是一个快速、强大、灵活且易于使用的开源数据分析和操作工具,在Python环境下,我们可以通过pip直接进行安装。

pip install pandas

在Python代码中使用pandas首先需要导入:

import pandas as pd

创建一个示例数据:

# 统计一行/一列数据的负数出现的次数
df = pd.DataFrame(
    {'a':[1,-3,0,1,3],
     'b':[-1,0,1,5,1],
     'c':[0,-2,0,-9,0]})
df
9b492099438cfec84b039f0ea82e69b8.png

总结分享

> 1 统计一行/一列数据的负数出现的次数

# 获取到每一行的复数个数
# 要获取列的话,将axis改成0即可
num_list = (df < 0).astype(int).sum(axis=1)
num_list

6cb3819ebf798d51a365d6b251f3ed97.png

> 2 让dataframe里面的正数全部变为0

# 直接了当
df[df>0] = 0
df

f7d6823d45137e7d8817ddecc23e71ea.png

> 3 统计某列中各元素出现次数

  • 默认情况,直接统计出指定列各元素值出现的次数。

# 默认情况,统计b列各元素出现次数
df['b'].value_counts()

1e80f84937a6e5d3778aa2a05bf88e58.png

  • 最好奇的bins参数,按bins分割区间,统计落在各区间内元素个数

# 按指定区间个数bin,元素起始值分割区间,统计表格中落在各区间内元素个数
df['b'].value_counts(bins=3)

5994cc92d101a5f60fff2d818806999c.png

  • normalize参数,计算各元素出现次数占比

# normalize参数 出现次数/总数据个数 
df['b'].value_counts(normalize=True)

8f143d77cc423ba57150465f921f400c.png

还有sort和ascending,可以按指定方式对统计结果进行排序。

> 4 修改表头和索引

  • 修改表头名称

# 修改表头名称
columns = {'a': 'A', 'b': 'B'}
df.rename(columns=columns, inplace=True)
df

ad158f12b2cb35e9aca1320ec3bdfcb9.png

  • 设置特殊索引

# 设置特殊索引
df.index = ['a', 'b', 'c', 'd', 'e']
df

aed766ea89a8927a9fd0e1541c33df9e.png

  • 删除索引

# 删除索引
df.reset_index(drop=True, inplace=True)
df

9fcc6b06911cb321c7362d9616ba4fa5.png

> 5 修改列所在位置insert+pop

insert在指定位置插入某列值;pop按列名取出某列(同时会删掉该列)。

# 将A列移到最后
# 新增列位置,新增列名,新增列的数值
df.insert(2,'A',df.pop('A'))
df

2e687c203b43ae6f8e87ea4b293ef3ed.png

> 6 常用查询方法query

  • 直接查询

# 找出c所有c值小于0的行
df.query("c<0")

cd8fc7d858568ff743d38ba372e52794.png

  • query+contains模糊查询

# 插入一列
df.insert(0,'name',['张三', '张华', '李四', '王五', '李逵'])
# 查找名字里包含三、四、五的用户数据
df.query("name.str.contains('三|四|五')", engine='python')

fa4b72166cd0f75c11418bdadf26f65b.png

> 7 数据存储时不要索引

设置index为None即可。

df.to_csv('测试数据.csv', encoding='utf-8-sig', index=None)

174e35490a634e0734a340ee6c7850c0.png

> 8 按指定列排序sort_values

sort_values函数,通过by参数可以指定按哪些列进行排序,还可以设置ascending指定排序方式(升序或者降序,默认降序)

# by 指定排序列 na_position nan值放的位置 开头还是尾部
df.sort_values(by=['name'],na_position='first')

087de7e77d72b620e602880f6daef6f5.png

> 9 apply 函数运用

# A B 两列都每个元素值都+1
df[['A', 'B']].apply(lambda x:x+1)

5727c1f91abb3c779f8bfc069b6735b7.png4513b2af831ecfcef5b5ec83602f8b03.png

DataFrame.apply(func, 
axis=0, broadcast=False, 
raw=False, reduce=None, args=(), **kwds)

> 10 Pandas数据合并

进行数据合并前,首先需要确定合并的数据的表头都是一致的,然后将他们依次加入一个列表,最终使用concat函数即可进行数据合并。

# 现将表构成list,然后再作为concat的输入
df1 = df[0:1]
df2 = df[2:4]
df3 = df[3:5]
frames = [df1, df2, df3]
df4 = pd.concat(frames)
df4

94747fe6b558365bf2ba0fb8ceb55ad6.png

> 11 Pandas Dataframe拷贝

  • 深拷贝,df1改变,df不会变

# 深拷贝,df1改变,df不会变
df1 = df.copy(deep=True)
print(f"df\n{df}\ndf1\n{df1}")

2548fcff279cae52f53695648a28a30b.png

  • 将原数据df的name列的第一个元素改为zs,会发现,df改动,不会影响df1。

df['name'][0] = 'zs'
print(f"df\n{df}\ndf1\n{df1}")

fddd0df15ce804893fe14f424c026e61.png

  • 浅拷贝,df2改变,df也会变  等同df2 = df

# 浅拷贝,df2改变,df也会变  等同df2 = df
df2 = df.copy(deep=False)
print(f"df\n{df}\ndf2\n{df2}")
  • 将原数据df的name列的第一个元素改为张三,会发现,df改动,df2也会一起改动。

df['name'][0] = '张三'
print(f"df\n{df}\ndf2\n{df2}")

b841378eb118bbb89e50bfa80bc7ce1e.png

> 12 对于列/行的操作

  • 删除指定行/列

# 行索引/列索引 多行/多列可以用列表
# axis=0表示行 axis=1表示列 inplace是否在原列表操作 
# 删除df中的c列
df.drop('c', axis=1, inplace=True)
df

40ea60d07636706aa7052e285542b1d8.png

  • 取出指定列/行

# 不知道列名,取出表格最后两列
df3 = df.iloc[:, -2:]  
# 知道列名,取出name和A两列
df4 = df.loc[:, ['name', 'A']]  
print(f"df3\n{df3}\ndf4\n{df4}")

1b25a4788a31464708c159523e4f9668.png

# 重新设置下索引
df.index = ['a1', 'a2', 'a3', 'a4', 'a5']

# 不知道行索引,取出表格前两行
df5 = df.iloc[:2, :]  
# 知道行索引,取出a1和a3两行
df6 = df.loc[['a1', 'a3'], :]  
print(f"df5\n{df5}\ndf6\n{df6}")

4ea579374eeeb01217c33cf209cbb2d2.png

  • 交换两列指定值

# 将B列中小于0的元素和A列交换
# 筛选出B列中小于0的行
flag = df['B'].astype(int).map(lambda x: x<0)
# 通过布尔提取交换两列数据
df.loc[flag, 'B'], df.loc[flag, 'A'] = df.loc[flag, 'A'], df.loc[flag, 'B']
df

5270e080e000064aec31451c84939705.png

好啦,今天的分享就到这里啦,下会有新的积累,再分享给大家,也欢迎大家留言区留言说说你平时pandas用的比较多的操作呀~互相学习,才能一起进步,更快的进步。

27c4a6b6f4e631fc71219eadac78489a.gif

d57b6d34fd9da9b34de9a7a0abfb569b.png

技术

Python实现一个电影订票系统

技术

用Python实现十大经典排序算法

技术

快速实现Resnet残差模型实战

资讯

隐患:神经网络可以隐藏恶意软件

263654ab394d288e59e6a42babe870d6.png

分享

adf201c5070c3cd7692ecc8a69a87ddc.png

点收藏

d517238cba4bc0d369af09c187f57400.png

点点赞

6a6215db5e8c4d6848f7e0d9c9b7fe0c.png

点在看

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐