c++ map 遍历_Python教学篇:Pandas中apply()和map()的使用技巧(附代码)

直观的Pandas教程,介绍如何使用apply()和使用函数applymap()以及如何使用替代值map()

c2e3fa0d4d9f885b888c54781ef175ab.png

在数据处理中,通常需要对特定的行或列执行操作(例如统计计算,拆分或替换值)以获得新数据。编写一个for循环来遍历Pandas DataFrame和Series可以完成这项工作,但这似乎不是一个好主意。for循环往往具有更多的代码性,更少的代码可读性和较慢的性能。

幸运的是,熊猫已经内置了许多很棒的方法来帮助您实现目标!在本文中,我们将看到如何使用apply()和来执行操作applymap(),以及如何使用来代替值map()。

首先,您应该意识到DataFrame和Series将具有这三种方法中的一些或全部,如下所示:

bae64a64a4f8d85a03385773eb9d39e0.png

Pandas官方API参考建议:

  • apply()用于沿DataFrame的轴Series的值应用函数。
  • applymap() 用于将功能按元素应用于DataFrame。
  • map() 用于将系列中的每个值替换为另一个值。

演示数据集

在深入研究细节之前,让我们首先创建一个DataFrame进行演示。

import pandas as pddf = pd.DataFrame({ 'A': [1,2,3,4],                    'B': [10,20,30,40],                   'C': [20,40,60,80]                  },                   index=['Row 1', 'Row 2', 'Row 3', 'Row 4'])
22a57a407367a4859e4b0b77f820de9f.png

适用于Apply,ApplyMap和Map演示的数据集

如何使用apply()?

Pandas apply()用于沿DataFrame的轴Series的值应用函数。

让我们从一个简单的示例开始,对每一行求和并将结果保存到新列“ D”中

# Let's call this "custom_sum" as "sum" is a built-in functiondef custom_sum(row):    return row.sum()df['D'] = df.apply(custom_sum, axis=1)

这是输出

fef84bb0e86debd84a8d753ed5be7ba8.png

df [ 'D' ] = df.apply(custom_sum,axis = 1)的结果

让我们来看看 df.apply(custom_sum, axis=1)

  • 第一个参数custom_sum是一个函数。
  • 第二个参数axis是指定将功能应用到哪个轴。0用于将函数应用于每一列,以及1用于将该函数应用于每一行。

让我以一种更直观的方式来解释这个过程。第二个参数axis = 1告诉Pandas使用该行。因此,将custom_sum应用于每行并返回一个新的Series,并将每行的输出作为值。

34efea910d02d2a8cabeafdc04152e46.png

了解了每一行的总和后,每列的总和只是用来axis = 0代替

df.loc['Row 5'] = df.apply(custom_sum, axis=0)
9194569fbd4f2134c1abc0e5d7d2f706.png

到目前为止,我们一直在讨论apply()DataFrame。同样,apply()可以在Series的值上使用。例如,将“ C”列乘以2,然后将结果保存到新的“ D”列中

def multiply_by_2(val):    return val * 2df['D'] = df['C'].apply(multiply_by_2)

注意,df[‘C’]它用于选择列“ C”,然后apply()使用only参数调用multiply_by_2。因为Series是一维数组,所以我们不再需要指定轴。返回值是一个系列并获得由分配到新列d 。df[‘D’]

a2c80da0917e604e1636206282ab731b.png

一系列上apply()的输出

将lambda与apply一起使用

您还可以将lambda表达式与Pandas apply()函数一起使用。

等效于lambda的DataFrame每行的总和:

df ['D'] = df.apply(lambda x:x.sum(),axis = 1)

等效于lambda的DataFrame每列的总和:

df ['Row 5'] = df.apply(lambda x:x.sum(),axis = 0)

在系列上乘以2的等效lambda:

df ['D'] = df ['C'].apply(lambda x:x * 2)

使用result_type参数

result_type是apply()设置为'expand','reduce'或'broadcast'获取所需结果类型的参数。

在上述情况下,如果result_type将设置为,'broadcast'则输出将是一个由custom_sum值替换的DataFrame 。

df.apply(custom_sum,axis = 1,result_type ='broadcast')
6ce8791070002f569e68dc88ee27aa0f.png

结果将广播到帧的原始形状,保留原始索引和列。

为了理解result_typeas 'expand'和'reduce',我们首先创建一个返回列表的函数。

def cal_multi_col(row):    return [row['A'] * 2, row['B'] * 3]

现在,跨越与数据框架将此功能result_type作为'expand'

def cal_multi_col(row):    return [row['A'] * 2, row['B'] * 3]
eb8f8650a95fe8f2aaf7705c78e843eb.png

输出是具有列名0和1的新DataFrame 。

为了将此附加到现有的DataFrame中,必须将结果保存在变量中,以便可以通过访问列名res.columns。

res = df.apply(cal_multi_col,axis = 1,result_type ='expand')df [ res.columns ] = res

输出为:

a4dca77079ee4ed69ff64a23cff22ba5.png

输出result_type ='expand'

接下来,应用功能在整个数据框柱result_type作为'reduce'。result_type='reduce'与相对,'expand'并在可能的情况下返回一个Series,而不是扩展类似列表的结果。

1a096c26f32deadb1001c0c00f466f66.png

result_type ='reduce'的输出

如何使用applymap()?

applymap()仅在DataFrame中可用,并用于整个DataFrame的元素级操作。它已经过优化,在某些情况下比快得多apply(),但是最好apply()在进行任何较重的操作之前将其与进行比较。

例如:输出一个数字为平方的DataFrame

df.applymap(np.square)
1bff7840b669d0ef4ffcafd36f0d4c35.png

map()仅在系列中可用,用于将系列中的每个值替换为另一个值。要了解map()工作原理,我们首先创建一个系列。

>>> s = pd.Series(['cat', 'dog', np.nan, 'rabbit'])>>> s0      cat1      dog2      NaN3   rabbitdtype: object

map()接受一个dict或一个Series。在中找不到的值dict会转换为NaN,除非dict具有默认值(例如defaultdict):

>>> s.map({'cat': 'kitten', 'dog': 'puppy'})0   kitten1    puppy2      NaN3      NaNdtype: object

它还接受一个功能:

>>> s.map('I am a {}'.format)0       I am a cat1       I am a dog2       I am a nan3    I am a rabbitdtype: object

为避免将函数应用于缺失值(并将其保留为NaN),na_action='ignore'可以使用:

>>> s.map('I am a {}'.format, na_action='ignore')0     I am a cat1     I am a dog2            NaN3  I am a rabbitdtype: object

摘要

对于DataFrame:

  • apply():当您要沿行或列应用函数时使用。axis = 0用于列和axis = 1行。
  • applymap():用于整个DataFrame的元素级操作。

对于系列:

  • apply():当您要在Series的值上应用函数时使用。
  • map():用于将每个值替换为另一个值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值