快捷搜索:  汽车  科技

pandas教程菜鸟教程(你不知道的pandas的5个基本技巧)

pandas教程菜鸟教程(你不知道的pandas的5个基本技巧)df[df.price.between(2 4)]使用betweendf = pd.DataFrame({'price': [1.99 3 5 0.5 3.5 5.5 3.9]})使用between功能,您可以减少此过滤器:df[(df.price >= 2) & (df.price <= 4)]

如何用pandas处理大数据学习"between"、"reindex"等功能。

pandas教程菜鸟教程(你不知道的pandas的5个基本技巧)(1)

这5个pandas的功能是非常有用的,但有时候却被人忽略

between 函数

多年来我一直在SQL中使用"between"函数,但直到最近才在pandas中发现它。

假设我们有一个带有价格的DataFrame,我们想要过滤2到4之间的价格。

df = pd.DataFrame({'price': [1.99 3 5 0.5 3.5 5.5 3.9]})

使用between功能,您可以减少此过滤器:

df[(df.price >= 2) & (df.price <= 4)]

使用between

df[df.price.between(2 4)]

pandas教程菜鸟教程(你不知道的pandas的5个基本技巧)(2)

它看起来可能不多,但是当编写许多过滤器时,这些括号很烦人。带有between函数的过滤器也更具可读性。

函数集合都是有等号的:左<=series<=右

用reindex函数修正行顺序

重索引函数为一个序列或一个数据文件生成一个新索引。在生成具有预定义顺序的列的报告时,我使用reindex函数。

让我们把t恤的尺寸添加到我们的数据库里。分析的目的是计算每种尺寸的平均价格:

df = pd.DataFrame({'price': [1.99 3 5] 'size': ['medium' 'large' 'small']})df_avg = df.groupby('size').price.mean() df_avg

pandas教程菜鸟教程(你不知道的pandas的5个基本技巧)(3)

在上表中,大小的顺序是随机的。应该订小杯、中杯、大杯。由于大小是字符串,我们不能使用sort_values函数。这里有一个重新索引函数:

df_avg.reindex(['small' 'medium' 'large'])

pandas教程菜鸟教程(你不知道的pandas的5个基本技巧)(4)

通过在reindex函数中指定大小的顺序,使得结果更容易解释。

Describe函数

描述函数是进行探索性数据分析时必不可少的工具。它显示了DataFrame中所有列的基本汇总统计信息。

df.price.describe()

pandas教程菜鸟教程(你不知道的pandas的5个基本技巧)(5)

如果我们想计算10个分位数而不是3个呢?

df.price.describe(percentiles=np.arange(0 1 0.1))

pandas教程菜鸟教程(你不知道的pandas的5个基本技巧)(6)

描述函数接受百分比参数。我们可以使用NumPy的arange函数指定百分比数,以避免手工输入每个百分比。

当与group by功能结合时,这个功能变得非常有用:

df.groupby('size').describe(percentiles=np.arange(0 1 0.1))

pandas教程菜鸟教程(你不知道的pandas的5个基本技巧)(7)

使用正则表达式进行文本搜索

我们的t恤数据集有3种尺寸。假设我们想要过滤小的和中号的。一种繁琐的过滤方式是:

df[(df['size'] == 'small') | (df['size'] == 'medium')]

这很糟糕,因为我们通常将其与其他过滤器结合在一起,这使得表达式不可读。有更好的方法吗?

pandas字符串列有一个"str"访问器,它实现了许多简化字符串操作的函数。其中之一是"contains"函数,它支持使用正则表达式进行搜索。

df[df['size'].str.contains('small|medium')]

带有"contains"函数的过滤器可读性更强,更容易扩展和与其他过滤器组合。

大内存数据集

pandas甚至不能读取比主内存数据集更大的数据。它抛出MemoryError或内核崩溃。但是要处理一个大数据集,你不需要Dask或Vaex这样的包,只需要一些小技巧。

iter_csv = pd.read_csv('dataset.csv' iterator=True chunksize=1000) df = pd.concat([chunk[chunk['field'] > constant] for chunk in iter_csv])

分块读取数据集比一次全部读取要慢。我建议只在大于内存数据集的情况下使用这种方法。

在这种情况下,你不需要所有的列,你可以指定需要的列"usecols"参数时,读取数据集:

df = pd.read_csv('file.csv' usecols=['col1' 'col2'])

这两种方法的好处是可以将它们组合在一起。

作者:Roman Orac

deephub翻译组

猜您喜欢: