来源:机器学习算法与Python学习

本文约2639,建议阅读6分钟。

本文一共为大家分享25个pandas技巧。

显示已安装的版本

输入下面的命令查询pandas版本:

1In [7]:pd.__version__
2Out[7]: 0.24.2

如果你还想知道pandas所依赖的模块的版本,你可以使用show_versions()函数:

 1In [9]:2pd.show_versions()34INSTALLED VERSIONS 5------------------ 6commit: None 7python: 3.7.3.final.0 8python-bits: 64 9OS: Darwin
10OS-release: 18.6.0
11machine: x86_64
12processor: i386
13byteorder: little
14LC_ALL: None
15LANG: en_US.UTF-8
16LOCALE: en_US.UTF-8
17
18pandas: 0.24.2
19pytest: None
20pip: 19.1.1
21setuptools: 41.0.1
22Cython: None
23numpy: 1.16.4
24scipy: None
25pyarrow: None
26xarray: None
27IPython: 7.5.0
28sphinx: None
29patsy: None
30dateutil: 2.8.0
31pytz: 2019.1
32blosc: None
33bottleneck: None
34tables: None
35numexpr: None
36feather: None
37matplotlib: 3.1.0
38openpyxl: None
39xlrd: None
40xlwt: None
41xlsxwriter: None
42lxml.etree: None
43bs4: None
44html5lib: None
45sqlalchemy: None
46pymysql: None
47psycopg2: None
48jinja2: 2.10.1
49s3fs: None
50fastparquet: None
51pandas_gbq: None
52pandas_datareader: None
53gcsfs: None

你可以查看到Python,pandas, Numpy, matplotlib等的版本信息。

创建示例DataFrame

假设你需要创建一个示例DataFrame。有很多种实现的途径,我最喜欢的方式是传一个字典给DataFrame constructor,其中字典中的keys为列名,values为列的取值。

现在如果你需要创建一个更大的DataFrame,上述方法则需要太多的输入。在这种情况下,你可以使用Numpy的random.rand()函数,告诉它行数和列数,将它传递给DataFrame constructor:

这种方式很好,但如果你还想把列名变为非数值型的,你可以强制地将一串字符赋值给columns参数:

你可以想到,你传递的字符串的长度必须与列数相同。

更改列名

让我们来看一下刚才我们创建的示例DataFrame:

我更喜欢在选取pandas列的时候使用点(.),但是这对那么列名中含有空格的列不会生效。让我们来修复这个问题。

更改列名最灵活的方式是使用rename()函数。你可以传递一个字典,其中keys为原列名,values为新列名,还可以指定axis:

1In [14]:
2df = df.rename({ col one : col_one ,  col two : col_two }, axis= columns )

使用这个函数最好的方式是你需要更改任意数量的列名,不管是一列或者全部的列。

如果你需要一次性重新命令所有的列名,更简单的方式就是重写DataFrame的columns属性:

1In [15]:
2df.columns = [ col_one ,  col_two ]

如果你需要做的仅仅是将空格换成下划线,那么更好的办法是使用str.replace()方法,这是因为你都不需要输入所有的列名:

1In [16]:
2df.columns = df.columns.str.replace(   ,  _ )

上述三个函数的结果都一样,可以更改列名使得列名中不含有空格:

最后,如果你需要在列名中添加前缀或者后缀,你可以使用add_prefix()函数

或者使用add_suffix()函数

行序反转

让我们来看一下drinks这个DataFame:

1In [20]:
2drinks.head()
3
4Out[20]:
country beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol continent
0 Afghanistan 0 0 0 0.0 Asia
1 Albania 89 132 54 4.9 Europe
2 Algeria 25 0 14 0.7 Africa
3 Andorra 245 138 312 12.4 Europe
4 Angola 217 57 45 5.9 Africa

该数据集描述了每个国家的平均酒消费量。如果你想要将行序反转呢?

最直接的办法是使用loc函数并传递::-1,跟Python中列表反转时使用的切片符号一致:

1In [21]:
2drinks.loc[::-1].head()
3
4Out[21]:
country beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol continent
192 Zimbabwe 64 18 4 4.7 Africa
191 Zambia 32 19 4 2.5 Africa
190 Yemen 6 0 0 0.1 Asia
189 Vietnam 111 2 1 2.0 Asia
188 Venezuela 333 100 3 7.7 South America

如果你还想重置索引使得它从0开始呢?

你可以使用reset_index()函数,告诉他去掉完全抛弃之前的索引:

1In [22]:
2drinks.loc[::-1].reset_index(drop=True).head()
3
4Out[22]:
country beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol continent
0 Zimbabwe 64 18 4 4.7 Africa
1 Zambia 32 19 4 2.5 Africa
2 Yemen 6 0 0 0.1 Asia
3 Vietnam 111 2 1 2.0 Asia
4 Venezuela 333 100 3 7.7 South America

你可以看到,行序已经反转,索引也被重置为默认的整数序号。

列序反转

跟之前的技巧一样,你也可以使用loc函数将列从左至右反转:

1In [23]:
2drinks.loc[:, ::-1].head()
3
4Out[23]:
continent total_litres_of_pure_alcohol wine_servings spirit_servings beer_servings country
0 Asia 0.0 0 0 0 Afghanistan
1 Europe 4.9 54 132 89 Albania
2 Africa 0.7 14 0 25 Algeria
3 Europe 12.4 312 138 245 Andorra
4 Africa 5.9 45 57 217 Angola

逗号之前的冒号表示选择所有行,逗号之后的::-1表示反转所有的列,这就是为什么country这一列现在在最右边。

通过数据类型选择列

这里有drinks这个DataFrame的数据类型:

 1In [24]:2drinks.dtypes34Out[24]:5country                          object6beer_servings                     int647spirit_servings                   int648wine_servings                     int649total_litres_of_pure_alcohol    float64
10continent                        object
11dtype: object

假设你仅仅需要选取数值型的列,那么你可以使用select_dtypes()函数

1In [25]:
2drinks.select_dtypes(include= number ).head()
3
4Out[25]:
beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol
0 0 0 0 0.0
1 89 132 54 4.9
2 25 0 14 0.7
3 245 138 312 12.4
4 217 57 45 5.9

这包含了int和float型的列。

你也可以使用这个函数来选取数据类型为object的列:

你还可以选取多种数据类型,只需要传递一个列表即可:

你还可以用来排除特定的数据类型:

将字符型转换为数值型

让我们来创建另一个示例DataFrame:

这些数字实际上储存为字符型,导致其数据类型为object:

为了对这些列进行数学运算,我们需要将数据类型转换成数值型。你可以对前两列使用astype()函数

但是,如果你对第三列也使用这个函数,将会引起错误,这是因为这一列包含了破折号(用来表示0)但是pandas并不知道如何处理它。

你可以对第三列使用to_numeric()函数,告诉其将任何无效数据转换为NaN:

如果你知道NaN值代表0,那么你可以fillna()函数将他们替换成0:

最后,你可以通过apply()函数一次性对整个DataFrame使用这个函数:

仅需一行代码就完成了我们的目标,因为现在所有的数据类型都转换成float:

减小DataFrame空间大小

pandas DataFrame被设计成可以适应内存,所以有些时候你可以减小DataFrame的空间大小,让它在你的系统上更好地运行起来。

这是drinks这个DataFrame所占用的空间大小:

可以看到它使用了30.4KB。

如果你对你的DataFrame有操作方面的问题,或者你不能将它读进内存,那么在读取文件的过程中有两个步骤可以使用来减小DataFrame的空间大小。

第一个步骤是只读取那些你实际上需要用到的列,可以调用usecols参数:

通过仅读取用到的两列,我们将DataFrame的空间大小缩小至13.6KB。

第二步是将所有实际上为类别变量的object列转换成类别变量,可以调用dtypes参数:

通过将continent列读取为category数据类型,我们进一步地把DataFrame的空间大小缩小至2.3KB。

值得注意的是,如果跟行数相比,category数据类型的列数相对较小,那么catefory数据类型可以减小内存占用。

按行从多个文件中构建DataFrame

假设你的数据集分化为多个文件,但是你需要将这些数据集读到一个DataFrame中。

举例来说,我有一些关于股票的小数聚集,每个数据集为单天的CSV文件。这是第一天的:

这是第二天的:

这是第三天的:

你可以将每个CSV文件读取成DataFrame,将它们结合起来,然后再删除原来的DataFrame,但是这样会多占用内存且需要许多代码

更好的方式为使用内置的glob模块。你可以给glob()函数传递某种模式,包括未知字符,这样它会返回符合该某事的文件列表。在这种方式下,glob会查找所有以stocks开头的CSV文件:

glob会返回任意排序的文件名,这就是我们为什么要用Python内置的sorted()函数来对列表进行排序。

我们以生成器表达式用read_csv()函数来读取每个文件,并将结果传递给concat()函数,这会将单个的DataFrame按行来组合:

不幸的是,索引值存在重复。为了避免这种情况,我们需要告诉concat()函数来忽略索引,使用默认的整数索引:

按列从多个文件中构建DataFrame

上一个技巧对于数据集中每个文件包含行记录很有用。但是如果数据集中的每个文件包含的列信息呢?

这里有一个例子,dinks数据集被划分成两个CSV文件,每个文件包含三列:

同上一个技巧一样,我们以使用glob()函数开始。这一次,我们需要告诉concat()函数按列来组合:

现在我们的DataFrame已经有六列了。

——END——

整理了 25 个 Pandas 实用技巧,拿走不谢!相关推荐

  1. 38个Pandas实用技巧

    1.计算变量缺失率 df=pd.read_csv('titanic_train.csv') def missing_cal(df):"""df :数据集return:每个 ...

  2. 快过年了,分享 25 个 JS 实用技巧送给大家吧

    本文主要介绍一些JS中用到的小技巧,可以在日常Coding中提升幸福度,将不定期更新~ 类型强制转换 1.1 string强制转换为数字 可以用 *1来转化为数字(实际上是调用 .valueOf方法) ...

  3. 计算机网络线上复试,线上复试实锤?在线复试技巧拿走不谢!

    原标题:线上复试实锤?在线复试技巧拿走不谢! 成绩出来后,留给复试的时间基本上就所剩无几了...今年复试估计还是线上线下复试同时进行,线上概率更大21萌新一定要提前做好线上复试的准备!小编给大家整理了 ...

  4. pandas 读取sqlserver_13个Pandas实用技巧,请收好

    点击关注上方"SQL数据库开发", 设为"置顶或星标",第一时间送达干货. 归纳整理了一些工作中常用到的pandas使用技巧,方便更高效地实现数据分析.文章很短 ...

  5. 13个Pandas实用技巧,有点香 !

    作者:风控猎人 归纳整理了一些工作中常用到的pandas使用技巧,方便更高效地实现数据分析.文章很短,不用收藏就能Get~ 1.计算变量缺失率 df=pd.read_csv('titanic_trai ...

  6. pandas object转float_25个Pandas实用技巧

    本文一共为大家分享25个pandas技巧,此为上篇~显示已安装的版本 输入下面的命令查询pandas版本: In [7]:pd.__version__Out[7]:'0.24.2' 如果你还想知道pa ...

  7. 【Python基础】Pandas笔记---通过比赛整理出的10条Pandas实用技巧

    点击上方"潜心的Python小屋"关注我们,第一时间推送优质文章. 前言 大家好,我是潜心.最近还在参加某比赛,将pandas对数据预处理的方法进行了总结,以下列出的10条是我觉得 ...

  8. 杭电计算机线上复试,线上复试实锤?在线复试技巧拿走不谢!

    昨日,研招网发文,现在已有多所院校确定线上复试:2021考研:多所招生单位明确线上复试 近日,部分招生单位已发通知称,复试方式原则上采用在线形式进行,还有部分招生单位官宣复试时间. ·北京大学 北京大 ...

  9. 怎样训练左右手协调_学钢琴左右手不协调怎么办?几个小技巧拿走不谢

    弹钢琴时双手配合的协调首先要做到合双手.脑先行,但对于刚接触钢琴不久的人来说,双手会很难做到协调配合,那么这其中有哪些技巧呢? 分分合合 就是在弹奏新乐曲时,一般要:先单手.后双手.再单手.再双手,这 ...

最新文章

  1. 2022-2028年中国DTRO膜行业市场全景评估及产业前景规划报告
  2. 准IT工作者如何择师、如何学习
  3. android9.0首发机型,安卓9.0正式发布,EMUI开启多款机型同步内部测试
  4. 台式机 双显卡切换实战
  5. GetWindowThreadProcessId
  6. 巴菲特发布2022年致股东公开信:盛赞苹果CEO
  7. DeFi 借贷协议 NAOS Finance 完成种子轮融资
  8. pivotx的entry和page内容里的日期格式修改
  9. Web前后端缓存技术(缓存的主要作用是什么)
  10. mysql5.1查询分析语句_MySQL 查询数据_mysql 查询语句_SELECT语句
  11. 鸿蒙os会给小米用吗,国内手机厂商是否支持鸿蒙?中兴正式回应!小米的态度很意外!...
  12. 新浪微博Emoji表情解析
  13. LM2903器件使用说明
  14. python爬虫天猫商品数据及分析(1)
  15. 【论文阅读】GPT系列论文详解
  16. 3 idiots的台词
  17. vue3 去除百度地图右上角地图类型展示
  18. 它是三大历史文献之一,明明价值连城,却被当做一堆废纸
  19. vue ssr搭建服务端渲染项目
  20. ads1258_ADS1258:高精度多通道模/数转换芯片

热门文章

  1. 【组队学习】【23期】Datawhale深度推荐模型
  2. 【复盘】小朋友的奇思妙想
  3. 线性代数:第二章 矩阵及其运算
  4. 《C#精彩实例教程》小组阅读06 -- C#运算符与表达式
  5. GPT-3:现实版的“贾维斯”?还是真「人工」智能?
  6. Imagination 推新款GPU IP,首次实现桌面级光线追踪效果
  7. 机器学习算法易受攻击?阿里“安全基建”这样应对AI的不安全
  8. 饿了么交易系统5年演化史
  9. 2020 年,AI 芯片内存哪家强?
  10. 我在MongoDB年终大会上获二等奖文章:由数据迁移至MongoDB导致的数据不一致问题及解决方案...