13个Pandas实用技巧,助你提高开发效率


Posted in Python onAugust 19, 2020

原作:风控猎人

整理:数据管道

归纳整理了一些工作中常用到的pandas使用技巧,方便更高效地实现数据分析。

1.计算变量缺失率

df=pd.read_csv('titanic_train.csv')
def missing_cal(df):
  """
  df :数据集
  
  return:每个变量的缺失率
  """
  missing_series = df.isnull().sum()/df.shape[0]
  missing_df = pd.DataFrame(missing_series).reset_index()
  missing_df = missing_df.rename(columns={'index':'col',
                      0:'missing_pct'})
  missing_df = missing_df.sort_values('missing_pct',ascending=False).reset_index(drop=True)
  return missing_df
missing_cal(df)

如果需要计算样本的缺失率分布,只要加上参数axis=1.

2.获取分组里最大值所在的行方法

分为分组中有重复值和无重复值两种。无重复值的情况。

df = pd.DataFrame({'Sp':['a','b','c','d','e','f'], 'Mt':['s1', 's1', 's2','s2','s2','s3'], 'Value':[1,2,3,4,5,6], 'Count':[3,2,5,10,10,6]})
df

df.iloc[df.groupby(['Mt']).apply(lambda x: x['Count'].idxmax())]

先按Mt列进行分组,然后对分组之后的数据框使用idxmax函数取出Count最大值所在的列,再用iloc位置索引将行取出。有重复值的情况

df["rank"] = df.groupby("ID")["score"].rank(method="min", ascending=False).astype(np.int64)
df[df["rank"] == 1][["ID", "class"]]

对ID进行分组之后再对分数应用rank函数,分数相同的情况会赋予相同的排名,然后取出排名为1的数据。

3.多列合并为一行

df = pd.DataFrame({'id_part':['a','b','c','d'], 'pred':[0.1,0.2,0.3,0.4], 'pred_class':['women','man','cat','dog'], 'v_id':['d1','d2','d3','d1']})

df.groupby(['v_id']).agg({'pred_class': [', '.join],'pred': lambda x: list(x),
'id_part': 'first'}).reset_index()

4.删除包含特定字符串所在的行

df = pd.DataFrame({'a':[1,2,3,4], 'b':['s1', 'exp_s2', 's3','exps4'], 'c':[5,6,7,8], 'd':[3,2,5,10]})
df[df['b'].str.contains('exp')]

5.组内排序

df = pd.DataFrame([['A',1],['A',3],['A',2],['B',5],['B',9]], columns = ['name','score'])

介绍两种高效地组内排序的方法。

df.sort_values(['name','score'], ascending = [True,False])
df.groupby('name').apply(lambda x: x.sort_values('score', ascending=False)).reset_index(drop=True)

6.选择特定类型的列

drinks = pd.read_csv('data/drinks.csv')
# 选择所有数值型的列
drinks.select_dtypes(include=['number']).head()
# 选择所有字符型的列
drinks.select_dtypes(include=['object']).head()
drinks.select_dtypes(include=['number','object','category','datetime']).head()
# 用 exclude 关键字排除指定的数据类型
drinks.select_dtypes(exclude=['number']).head()

7.字符串转换为数值

df = pd.DataFrame({'列1':['1.1','2.2','3.3'],
         '列2':['4.4','5.5','6.6'],
         '列3':['7.7','8.8','-']})
df
df.astype({'列1':'float','列2':'float'}).dtypes

用这种方式转换第三列会出错,因为这列里包含一个代表 0 的下划线,pandas 无法自动判断这个下划线。为了解决这个问题,可以使用 to_numeric() 函数来处理第三列,让 pandas 把任意无效输入转为 NaN。

df = df.apply(pd.to_numeric, errors='coerce').fillna(0)

8.优化 DataFrame 对内存的占用

方法一:只读取切实所需的列,使用usecols参数

cols = ['beer_servings','continent']
small_drinks = pd.read_csv('data/drinks.csv', usecols=cols)

方法二:把包含类别型数据的 object 列转换为 Category 数据类型,通过指定 dtype 参数实现。

dtypes ={'continent':'category'}
smaller_drinks = pd.read_csv('data/drinks.csv',usecols=cols, dtype=dtypes)

9.根据最大的类别筛选 DataFrame

movies = pd.read_csv('data/imdb_1000.csv')
counts = movies.genre.value_counts()
movies[movies.genre.isin(counts.nlargest(3).index)].head()

10.把字符串分割为多列

df = pd.DataFrame({'姓名':['张 三','李 四','王 五'],
          '所在地':['北京-东城区','上海-黄浦区','广州-白云区']})
df
df.姓名.str.split(' ', expand=True)

11.把 Series 里的列表转换为 DataFrame

df = pd.DataFrame({'列1':['a','b','c'],'列2':[[10,20], [20,30], [30,40]]})
df

df_new = df.列2.apply(pd.Series)
pd.concat([df,df_new], axis='columns')

12.用多个函数聚合

orders = pd.read_csv('data/chipotle.tsv', sep='\t')
orders.groupby('order_id').item_price.agg(['sum','count']).head()

13.分组聚合

import pandas as pd
df = pd.DataFrame({'key1':['a', 'a', 'b', 'b', 'a'],
  'key2':['one', 'two', 'one', 'two', 'one'],
  'data1':np.random.randn(5),
   'data2':np.random.randn(5)})
df

for name, group in df.groupby('key1'):
  print(name)
  print(group)

dict(list(df.groupby('key1')))

通过字典或Series进行分组

people = pd.DataFrame(np.random.randn(5, 5),
   columns=['a', 'b', 'c', 'd', 'e'],
   index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])
mapping = {'a':'red', 'b':'red', 'c':'blue',
   'd':'blue', 'e':'red', 'f':'orange'}
by_column = people.groupby(mapping, axis=1)
by_column.sum()

以上就是13个Pandas实用技巧,助你提高开发效率的详细内容,更多关于Pandas实用技巧的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python 默认参数问题的陷阱
Feb 29 Python
python检查URL是否正常访问的小技巧
Feb 25 Python
详解 Python 读写XML文件的实例
Aug 02 Python
Python实现字符串反转的常用方法分析【4种方法】
Sep 30 Python
Python实现PS图像抽象画风效果的方法
Jan 23 Python
在Python中增加和插入元素的示例
Nov 01 Python
Python实现定时自动关闭的tkinter窗口方法
Feb 16 Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 Python
python利用dlib获取人脸的68个landmark
Nov 27 Python
python wxpython 实现界面跳转功能
Dec 17 Python
Python 实现训练集、测试集随机划分
Jan 08 Python
Django之choices选项和富文本编辑器的使用详解
Apr 01 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
Aug 19 #Python
Python实现自动签到脚本的示例代码
Aug 19 #Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
Aug 19 #Python
Python容器类型公共方法总结
Aug 19 #Python
python3将变量输入的简单实例
Aug 19 #Python
手把手教你将Flask应用封装成Docker服务的实现
Aug 19 #Python
python实现每天自动签到领积分的示例代码
Aug 18 #Python
You might like
SONY ICF-SW7600的电路分析
2021/03/02 无线电
php表单提交与$_POST实例分析
2015/01/26 PHP
php简单判断文本编码的方法
2015/07/30 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
2016/03/21 PHP
PHP调用接口用post方法传送json数据的实例
2018/05/31 PHP
javascript 写类方式之四
2009/07/05 Javascript
ie focus bug 解决方法
2009/09/03 Javascript
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
浏览器打开层自动缓慢展开收缩实例代码
2013/07/04 Javascript
详解js闭包
2014/09/02 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
浅谈Web页面向后台提交数据的方式和选择
2016/09/23 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
node中的cookie的具体使用
2018/09/13 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
2019/03/07 jQuery
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
2019/11/25 Javascript
基于vue.js实现购物车
2020/01/15 Javascript
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
2016/06/29 Python
Python实现的调用C语言函数功能简单实例
2019/03/13 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
PHP统计代码行数的小代码
2019/09/19 Python
CSS3 旋转立方体问题详解
2020/01/09 HTML / CSS
什么是Remote Module
2016/06/10 面试题
就业推荐表自我鉴定
2013/10/29 职场文书
大学生求职工作的自我评价
2014/02/13 职场文书
村班子对照检查材料
2014/08/18 职场文书
2014社区健康教育工作总结
2014/12/16 职场文书
党员争先创优承诺书
2015/01/20 职场文书
2016先进工作者事迹材料
2016/02/25 职场文书
Spring Data JPA的Audit功能审计数据库的变更
2021/06/26 Java/Android
分享提高 Python 代码的可读性的技巧
2022/03/03 Python
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL