20个Pandas函数详解

作者|Soner Yıldırım
编译|VK
来源|Towards Data Science

Pandas是一个python数据分析库。它提供了许多函数和方法来加快数据分析过程。pandas之所以如此普遍,是因为它具有强大的功能,以及他简单的语法和灵活性。

在这篇文章中,我将举例来解释20个常用的pandas函数。有些是很常见的,我敢肯定你以前用过。有些对你来说可能是新的。所有函数都将为你的数据分析过程增加价值。

import numpy as np
import pandas as pd

1.query

我们有时需要根据条件过滤一个数据帧。过滤数据帧的一个简单方法是query函数。让我们首先创建一个示例数据帧。

values_1 = np.random.randint(10, size=10)
values_2 = np.random.randint(10, size=10)
years = np.arange(2010,2020)
groups = ['A','A','B','A','B','B','C','A','C','C']
df = pd.DataFrame({'group':groups, 'year':years, 'value_1':values_1, 'value_2':values_2})
df

使用查询函数非常简单,只需要编写过滤条件。

df.query('value_1 < value_2')

2.insert

当我们想向dataframe添加一个新列时,默认情况下会在末尾添加它。但是,pandas提供了使用insert函数使得我们可以在任何位置添加新列。

我们需要通过传递索引作为第一个参数来指定位置。此值必须是整数。列索引从零开始,就像行索引一样。第二个参数是列名,第三个参数是对象,这些对象可以是Series 或数组。

#新建列
new_col = np.random.randn(10)
#在位置2插入新列
df.insert(2, 'new_col', new_col)
df

3.Cumsum

数据帧包含3个不同组的年份值。我们可能只对某些情况下的累积值感兴趣。Pandas提供了一个易于使用的函数来计算累计和,即cumsum

如果我们只应用cumsum函数,group里的(A,B,C)将被忽略,因为我们无法区分不同的组。我们可以应用groupby和cumsum函数,这样就可以区分出不同的组。

df['cumsum_2'] = df[['value_2','group']].groupby('group').cumsum()
df

4.Sample

Sample方法允许你从序列或数据帧中随机选择值。当我们想从一个分布中选择一个随机样本时,它很有用。

sample1 = df.sample(n=3)
sample1

我们用n参数指定值的数目,但我们也可以将比率传递给frac参数。例如,0.5将返回一半的行。

sample2 = df.sample(frac=0.5)
sample2

为了获得可重复的样本,我们可以使用随机的状态参数。如果将整数值传递给random_state,则每次运行代码时都将生成相同的示例。

5. Where

“Where”用于根据条件替换行或列中的值。默认的替换值是NaN,但是我们也可以指定替换的值。

df['new_col'].where(df['new_col'] > 0 , 0)

“where”的工作方式是选择符合条件的值,其余值替换为指定值。

where(df[‘new_col’]>0, 0)选择“new_col”中大于0的所有值,其余值替换为0。因此,这里也可以视为掩码操作。

重要的一点是,Pandas 和Numpy的“where”并不完全相同。我们可以用稍微不同的语法来达到相同的效果。DataFrame.where按原数据选择符合条件的值,其他值将替换为指定的值。Np.where还需要指定一个新数据。以下两行返回相同的结果:

df['new_col'].where(df['new_col'] > 0 , 0)
np.where(df['new_col'] < 0, df['new_col'], 0)

6.Isin

在处理数据帧时,我们经常使用过滤或选择方法。Isin方法是一种先进的过滤方法。例如,我们可以根据选择列表过滤值。

years = ['2010','2014','2017']
df[df.year.isin(years)]

7.Loc and iloc

Loc和iloc用于选择行和列。

  • loc:按标签选择

  • iloc:按位置选择

loc用于按标签选择数据。列的标签是列名。行标签要分情况,如果我们不分配任何特定的索引,pandas默认创建整数索引。iloc 按位置索引数据

使用iloc选择前3行和前2列:

使用loc选择前3行和前2列:

注:当使用loc时,切片得到的结果包括索引的边界,而使用iloc则不包括这些边界。

8.Pct_change

此函数用于计算一系列值的变化百分比。假设我们有一个包含[2,3,6]的序列。如果我们对这个序列应用pct_change,则返回的序列将是[NaN,0.5,1.0]。

从第一个元素到第二个元素增加了50%,从第二个元素到第三个元素增加了100%。Pct_change函数用于比较元素时间序列中的变化百分比。

df.value_1.pct_change()

9.Rank

Rank函数为值分配序。假设我们有一个包含[1,7,5,3]的序列s。分配给这些值的序为[1,4,3,2]。可以用这些序作排序操作

df['rank_1'] = df['value_1'].rank()
df

10.Melt

Melt用于将宽数据帧转换为窄数据帧。我所说的wide是指具有大量列的数据帧。

一些数据帧的结构是连续的度量或变量用列表示。在某些情况下,将这些列表示为行可能更适合我们的任务。考虑以下数据帧:

我们有三个不同的城市,在不同的日子进行测量。我们决定将这些日子表示为列中的行。还将有一列显示测量值。我们可以通过使用Melt函数轻松实现:

df_wide.melt(id_vars=['city'])

默认情况下,会给出变量和值列名。我们可以使用melt函数的var_name和value_name参数来指定新的列名。

11.Explode

假设你的数据集在一个观测(行)中包含一个要素的多个条目,但你希望在单独的行中分析它们。

我们想在不同的行上看到“day"1在ID为c上的测量值,用explode来完成。

df1.explode('measurement').reset_index(drop=True)

12.Nunique

Nunique统计列或行上的唯一条目数。它在分类特征中非常有用,特别是在我们事先不知道类别数量的情况下。让我们看看我们的初始数据帧:

df.year.nunique()
10
df.group.nunique()
3

我们可以直接将nunique函数应用于dataframe,并查看每列中唯一值的数量:

如果axis参数设置为1,nunique将返回每行中唯一值的数目。

13.lookup

它可以用于根据其他行-列对上的值在数据帧中查找值。假设我们有以下数据帧:

每天,我们有4个人的测量数据和一个列,其中包括这4个人的名字。

我们要创建一个新列,该列显示“person”列中人员对应他们的度量。因此,对于第一行,新列中的值将是4(“Alex”列中的值)。

df['Person_point'] = df.lookup(df.index, df['Person'])
df

14.Infer_objects

Pandas支持广泛的数据类型,其中之一就是object。对象包含文本或混合(数字和非数字)值。

但是,如果有其他选项可用,则不建议使用对象数据类型。使用更具体的数据类型,某些操作执行得更快。例如,对于数值,我们更喜欢使用整数或浮点数据类型。

infer_objects尝试为对象列推断更好的数据类型。考虑以下数据帧:

df2.dtypes
A    object 
B    object 
C    object 
D    object 
dtype: object

所有的数据类型都是object。让我们看看推断的数据类型是什么:

df2.infer_objects().dtypes
A      int64 
B    float64 
C       bool 
D     object 
dtype: object

它可能看起来没什么用,但在有很多列时绝对有用。

15.Memory_usage

Memory_usage返回每行使用的内存量(以字节为单位)。它非常有用,尤其是当我们处理大型数据帧时。考虑下面的数据帧,其中有一百万行。

df_large = pd.DataFrame({'A': np.random.randn(1000000),
                    'B': np.random.randint(100, size=1000000)})
df_large.shape
(1000000, 2)

以及每列的内存使用情况(以字节为单位):

df_large.memory_usage()
Index        128 
A        8000000 
B        8000000 
dtype: int64

整个数据帧的内存使用量(MB):

df_large.memory_usage().sum() / (1024**2) 
15.2589111328125

16.Describe

描述函数计算数字列的基本统计信息,这些列包括计数、平均值、标准差、最小值和最大值、中值、第一个和第三个四分位数。因此,它提供了数据帧的统计摘要。

17.Merge

Merge()根据共享列中的值组合数据帧。考虑以下两个数据帧。

我们可以根据列中的共享值合并它们。设置合并条件的参数是“on”参数。

df1和df2是基于column_a中的公共值进行合并的,merge函数的how参数允许以不同的方式组合数据帧。“内部”、“外部”、“左侧”、“右侧”的可能值。

  • inner:仅在on参数指定的列中具有相同值的行(how参数的默认值)

  • outer:所有行

  • left:左数据帧中的所有行

  • right:右数据帧中的所有行

类似于sql语句中的join

18.Select_dtypes

Select_dtypes函数根据对数据类型设置的条件返回数据帧列的子集。它允许使用include和exlude参数包含或排除某些数据类型。

df.select_dtypes(include='int64')

df.select_dtypes(exclude='int64')

19.replace

顾名思义,它允许替换数据帧中的值。

df.replace('A', 'A_1')

第一个参数是要替换的值,第二个参数是新值。

我们也可以在一个字典中同时进行多个替换。

df.replace({'A':'A_1', 'B':'B_1'})

20.Applymap

Applymap函数用于将函数应用于dataframe元素。

请注意,如果操作的向量化版本可用,那么它应该优先于applymap。例如,如果我们想将每个元素乘以一个数字,我们不需要也不应该使用applymap函数。在这种情况下,简单的向量化操作(例如df*4)要快得多。

然而,在某些情况下,我们可能无法选择向量化操作。例如,我们可以使用pandas dataframes的Style属性来更改dataframe的样式。以下函数将负值的颜色更改为红色。

def color_negative_values(val):
   color = 'red' if val < 0 else 'black'
   return 'color: %s' % color

我们需要使用applymap函数将此函数应用于数据帧。

df3.style.applymap(color_negative_values)

原文链接:https://towardsdatascience.com/20-pandas-functions-that-will-boost-your-data-analysis-process-f5dfdb2f9e05

欢迎关注磐创AI博客站:
http://panchuang.net/

sklearn机器学习中文官方文档:
http://sklearn123.com/

欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/

posted @ 2020-08-10 22:20  人工智能遇见磐创  阅读(2592)  评论(0编辑  收藏  举报