pandas object转float_Pandas技巧小盘点

译者:山阴少年   链接:

https://www.cnblogs.com/jclian91/p/12305471.html

本文一共为大家分享25个pandas技巧,分为两篇分享给大家。

显示已安装的版本

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

In [7]:pd.__version__Out[7]:'0.24.2'

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

In [9]:pd.show_versions()INSTALLED VERSIONS ------------------ commit: None python: 3.7.3.final.0 python-bits: 64 OS: Darwin OS-release: 18.6.0 machine: x86_64 processor: i386 byteorder: little LC_ALL: None LANG: en_US.UTF-8 LOCALE: en_US.UTF-8 pandas: 0.24.2 pytest: None pip: 19.1.1 setuptools: 41.0.1 Cython: None numpy: 1.16.4 scipy: None pyarrow: None xarray: None IPython: 7.5.0 sphinx: None patsy: None dateutil: 2.8.0 pytz: 2019.1 blosc: None bottleneck: None tables: None numexpr: None feather: None matplotlib: 3.1.0 openpyxl: None xlrd: None xlwt: None xlsxwriter: None lxml.etree: None bs4: None html5lib: None sqlalchemy: None pymysql: None psycopg2: None jinja2: 2.10.1 s3fs: None fastparquet: None pandas_gbq: None pandas_datareader: None gcsfs: None

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

创建示例DataFrame

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

9dd7020a505c63aa857ac3fc3b0c079e.png

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

0a294d585c1d2e26b8c5467eb7535286.png

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

87cc86a6756f900bc3be0974aa5ccf30.png

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

更改列名

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

f02326a5a31372fde7b803f33ba0ccd2.png

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


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

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

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


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

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

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

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

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

d2d2aa7e7d5f0e8ebe2113778eedce14.png

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

aa51f4291769ce7204478276aeb586a6.png

或者使用add_suffix()函数

11c93e3c52896a57a3aa1913a6c3d018.png

行序反转

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

In [20]:drinks.head()Out[20]:
countrybeer_servingsspirit_servingswine_servingstotal_litres_of_pure_alcoholcontinent
0Afghanistan0000.0Asia
1Albania89132544.9Europe
2Algeria250140.7Africa
3Andorra24513831212.4Europe
4Angola21757455.9Africa

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

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

In [21]:drinks.loc[::-1].head()Out[21]:
countrybeer_servingsspirit_servingswine_servingstotal_litres_of_pure_alcoholcontinent
192Zimbabwe641844.7Africa
191Zambia321942.5Africa
190Yemen6000.1Asia
189Vietnam111212.0Asia
188Venezuela33310037.7South America

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


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

In [22]:drinks.loc[::-1].reset_index(drop=True).head()Out[22]:
countrybeer_servingsspirit_servingswine_servingstotal_litres_of_pure_alcoholcontinent
0Zimbabwe641844.7Africa
1Zambia321942.5Africa
2Yemen6000.1Asia
3Vietnam111212.0Asia
4Venezuela33310037.7South America

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

列序反转

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

In [23]:drinks.loc[:, ::-1].head()Out[23]:
continenttotal_litres_of_pure_alcoholwine_servingsspirit_servingsbeer_servingscountry
0Asia0.0000Afghanistan
1Europe4.95413289Albania
2Africa0.714025Algeria
3Europe12.4312138245Andorra
4Africa5.94557217Angola

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

通过数据类型选择列

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

In [24]:drinks.dtypesOut[24]:country                          objectbeer_servings                     int64spirit_servings                   int64wine_servings                     int64total_litres_of_pure_alcohol    float64continent                        objectdtype: object

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

In [25]:drinks.select_dtypes(include='number').head()Out[25]:
beer_servingsspirit_servingswine_servingstotal_litres_of_pure_alcohol
00000.0
189132544.9
2250140.7
324513831212.4
421757455.9

这包含了int和float型的列。


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

5e2e48ae5e423631d959ed480189eed3.png

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

00d7f170145676400c0b79f8deea5d31.png

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

3a42e49e4c77eb8df0af120d48c0b944.png

将字符型转换为数值型

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

6284230579aafb9c53253d4138359569.png

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

982f3ebe031e6f74be990a974a24ec16.png

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

d3c0fb41b7ca915fe643cf24d6fa9a16.png

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

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

0caaa7aeb20d6cd89f55bbdc1c7d3449.png

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

4b328d259d973add28eb83457c424d94.png

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

28681158fb632ef16b57a07584d87b27.png

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

1b7bc4d0c8cc32a8185407747d09fff6.png

减小DataFrame空间大小

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


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

d19e699fd1d437dd095584c6b04c1d4d.png

可以看到它使用了30.4KB。


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

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

42572ecac4c86fb53b2c4a339920e67d.png

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


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

7f12387354ee5e48993cae138360a1a5.png

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


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

按行从多个文件中构建DataFrame

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


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

795392f0b3cd7388e48e322c9a9110b6.png

这是第二天的:

87a54c85d44fa9d1ad5d73ef041efe85.png

这是第三天的:

831fe3226a47be5492334cf7c110f601.png

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


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

5c4e80207d2d6e2c13f7fccf9a1eba6d.png

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


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

928643c50efd7fffb3c4547c53047af4.png

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

0d1de73b7c6dd0f4a4893a4328f53e42.png

按列从多个文件中构建DataFrame

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


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

1617f2a16de5953e9d1c1bc5218d1276.png

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

e89eaa21b2162221f7723326c98093d4.png

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

1de7628b5b42addfa03ba20f9b56e967.gif

往期推荐

趣味时光:自动扫雷小脚本制作!

让领导眼前一亮!用 GitHub Actions 写出高质量的 Python代码

用Python玩连连看,来一起爽一下?

程序员之间的鄙视链,我哭了!

Python3知识点流程控制、迭代器、生成器快速入门

2f82107e8e95176978e37d8705d75129.png

0e3cbc7b41c5c88947764dcd7f3bd15f.png

点击“阅读原文”,领取 2020 年最新免费技术资料大全

↓↓↓ 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Pandas 中,将一个 Pandas 对象转换float 类型可以使用 `astype()` 方法。 例如,如果 `df` 是一个 Pandas 数据帧,您可以将其所有的值转换float 类型,可以使用以下代码: ``` df = df.astype(float) ``` 如果您只需要将某一列转换float 类型,可以使用以下代码: ``` df['列名'] = df['列名'].astype(float) ``` 这样,您就可以将 Pandas 对象转换float 类型。请注意,如果数据中有非数字值,将无法将其转换float 类型。 ### 回答2: Pandas是一个功能强大的Python库,用于数据分析和数据处理。它提供了一种名为DataFrame的数据结构,可以轻松地处理和分析复杂的数据集合。其中,Pandas对象是一种基本的数据结构,它可以包括数值、字符串、日期、布尔值等各种数据类型。在进行数据处理时,经常需要将Pandas对象中的数据类型转换为合适的类型,比如float类型,这里介绍一些常用的方法。 1. 使用astype()方法 astype()方法是一种常用的数据类型转换方法。它可以将Pandas对象中的数据类型转换为指定的类型。例如,将一个Pandas Series对象转换float类型,可以使用以下代码: ```python s = pd.Series(['1.23', '2.34', '3.45']) s = s.astype(float) ``` 2. 使用to_numeric()方法 to_numeric()方法是一种更为灵活的数据类型转换方法。它可以将Pandas对象中的数据类型转换为数值类型,并且可以指定转换失败时的处理方式。例如,将一个Pandas Series对象转换float类型,可以使用以下代码: ```python s = pd.Series(['1.23', '2.34', '3.45']) s = pd.to_numeric(s, errors='coerce').astype(float) ``` 这里的errors参数指定了转换失败时的处理方式,使用'coerce'表示将转换失败的值替换为NaN。 3. 使用apply()方法 apply()方法是一种通用的数据处理方法。它可以将一个函数应用到一个Pandas对象中的每个元素,并返回一个新的Pandas对象。例如,将一个Pandas Series对象中的所有元素转换float类型,可以使用以下代码: ```python s = pd.Series(['1.23', '2.34', '3.45']) s = s.apply(float) ``` 这里的float()函数可以将字符串转换float类型。 总之,在处理Pandas对象中的数据类型时,需要根据具体的情况和需求选择合适的方法。以上介绍的方法是常用和可行的方法,可以根据需要进行选择和使用。 ### 回答3: pandas object是指Pandas中DataFrame中的一种数据类型,它可以存储不同种类的数据,包括文本、日期、数值等等。但有时我们需要把object类型化为float类型,方便计算和统计数据。 要把pandas object转换float,可以使用astype()方法,该方法可以将数据类型转换为指定类型。如下所示: df['column_name'] = df['column_name'].astype(float) 其中,df是DataFrame的名称,column_name是需要转换数据类型的列名。 需要注意的是,在转换之前,必须要确保该列中所有数据都是符合转换类型的格式,如果有数据格式不符合要求,astype()方法会抛出异常。 在转换完成之后,可以使用describe()方法了解一些统计信息,例如均值、标准差、最大值、最小值等等。如果转换完成后仍发现存在NaN值,可以使用fillna()方法进行填充,例如填充为0: df.fillna(0, inplace=True) 其中inplace=True表示直接在原数据上进行修改,如果填充后不需要再改回原始的object类型可以使用。 总之,将pandas object转换float,可以提高处理数据的效率,使得数据更加规范化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值