热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将值设置为DataFrame切片的副本-SettingvaluetoacopyofasliceofaDataFrame

Iamsettingupthefollowingexamplewhichissimilartomysituationanddata:我正在设置以下示例,该示例与我的情况和

I am setting up the following example which is similar to my situation and data:

我正在设置以下示例,该示例与我的情况和数据类似:

Say, I have the following DataFrame:

说,我有以下DataFrame:

df = pd.DataFrame ({'ID' : [1,2,3,4],
             'price' : [25,30,34,40],
             'Category' : ['small', 'medium','medium','small']})


  Category  ID  price
0    small   1     25
1   medium   2     30
2   medium   3     34
3    small   4     40

Now, I have the following function, which returns the discount amount based on the following logic:

现在,我有以下功能,它根据以下逻辑返回折扣金额:

def mapper(price, category):
    if category == 'small':
        discount = 0.1 * price
    else:
        discount = 0.2 * price
    return discount

Now I want the resulting DataFrame:

现在我想要生成的DataFrame:

  Category  ID  price Discount
0    small   1     25      0.25
1   medium   2     30      0.6
2   medium   3     40      0.8
3    small   4     40      0.4

So I decided to call series.map on the column price because I don't want to use apply. I am working on a large DataFrame and map is much faster than apply.

所以我决定在列价上调用series.map,因为我不想使用apply。我正在处理大型DataFrame,并且映射比应用快得多。

I tried doing this:

我试过这样做:

for c in list(sample.Category.unique()):
    sample[sample['Category'] == c]['Discount'] = sample[sample['Category'] == c]['price'].map(lambda x: mapper(x,c))

And that didn't work as I expected because I am trying to set a value on a copy of a slice of the DataFrame.

这并没有像我预期的那样工作,因为我试图在DataFrame片的副本上设置一个值。

My question is, Is there a way to do this without using df.apply()?

我的问题是,有没有办法在不使用df.apply()的情况下执行此操作?

3 个解决方案

#1


8  

One approach with np.where -

使用np.where的一种方法 -

mask = df.Category.values=='small'
df['Discount'] = np.where(mask,df.price*0.01, df.price*0.02)

Another way to put things a bit differently -

让事情有点不同的另一种方式 -

df['Discount'] = df.price*0.01
df['Discount'][df.Category.values!='small'] *= 2

For performance, you might want to work with array data, so we could use df.price.values instead at places where df.price was used.

为了提高性能,您可能希望使用数组数据,因此我们可以在使用df.price的地方使用df.price.values。

Benchmarking

Approaches -

def app1(df): # Proposed app#1 here
    mask = df.Category.values=='small'
    df_price = df.price.values
    df['Discount'] = np.where(mask,df_price*0.01, df_price*0.02)
    return df

def app2(df): # Proposed app#2 here
    df['Discount'] = df.price.values*0.01
    df['Discount'][df.Category.values!='small'] *= 2
    return df

def app3(df): # @piRSquared's soln
    df.assign(
    Discount=((1 - (df.Category.values == 'small')) + 1) / 100 * df.price.values)
    return df

def app4(df): # @MaxU's soln
    df.assign(Discount=df.price * df.Category.map({'small':0.01}).fillna(0.02))
    return df

Timings -

1) Large dataset :

1)大数据集:

In [122]: df
Out[122]: 
  Category  ID  price  Discount
0    small   1     25      0.25
1   medium   2     30      0.60
2   medium   3     34      0.68
3    small   4     40      0.40

In [123]: df1 = pd.concat([df]*1000,axis=0)
     ...: df2 = pd.concat([df]*1000,axis=0)
     ...: df3 = pd.concat([df]*1000,axis=0)
     ...: df4 = pd.concat([df]*1000,axis=0)
     ...: 

In [124]: %timeit app1(df1)
     ...: %timeit app2(df2)
     ...: %timeit app3(df3)
     ...: %timeit app4(df4)
     ...: 
1000 loops, best of 3: 209 µs per loop
10 loops, best of 3: 63.2 ms per loop
1000 loops, best of 3: 351 µs per loop
1000 loops, best of 3: 720 µs per loop

2) Very large dataset :

2)非常大的数据集:

In [125]: df1 = pd.concat([df]*10000,axis=0)
     ...: df2 = pd.concat([df]*10000,axis=0)
     ...: df3 = pd.concat([df]*10000,axis=0)
     ...: df4 = pd.concat([df]*10000,axis=0)
     ...: 

In [126]: %timeit app1(df1)
     ...: %timeit app2(df2)
     ...: %timeit app3(df3)
     ...: %timeit app4(df4)
     ...: 
1000 loops, best of 3: 758 µs per loop
1 loops, best of 3: 2.78 s per loop
1000 loops, best of 3: 1.37 ms per loop
100 loops, best of 3: 2.57 ms per loop

Further boost with data reuse -

数据重用进一步提升 -

def app1_modified(df):
    mask = df.Category.values=='small'
    df_price = df.price.values*0.01
    df['Discount'] = np.where(mask,df_price, df_price*2)
    return df

Timings -

In [133]: df1 = pd.concat([df]*10000,axis=0)
     ...: df2 = pd.concat([df]*10000,axis=0)
     ...: df3 = pd.concat([df]*10000,axis=0)
     ...: df4 = pd.concat([df]*10000,axis=0)
     ...: 

In [134]: %timeit app1(df1)
1000 loops, best of 3: 699 µs per loop

In [135]: %timeit app1_modified(df1)
1000 loops, best of 3: 655 µs per loop

#2


4  

Also using some numpy

也使用一些numpy

df.assign(
    Discount=((1 - (df.Category.values == 'small')) + 1) / 100 * df.price.values)

  Category  ID  price  Discount
0    small   1     25      0.25
1   medium   2     30      0.60
2   medium   3     34      0.68
3    small   4     40      0.40

The operative component being

操作组件是

(1 - (df.Category.values == 'small')) + 1) / 100 * df.price.values

This generates a single boolean array and performs simple arithmetic on it in order to get .01 and .02.

这会生成一个布尔数组,并对其执行简单的算术,以获得.01和.02。


naive time testing over given data

对给定数据进行天真时间测试

enter image description here


Thx @Divakar for pointing this out For those using python 2.x, you'll need to force the float issue by using this.

Thx @Divakar指出这一点对于那些使用python 2.x的人来说,你需要通过使用它来强制浮动问题。

df.assign(
    Discount=((1 - (df.Category.values == 'small')) + 1) / 100. * df.price.values)

#3


4  

Here is yet another Pandas approach:

这是另一个熊猫方法:

In [67]: df.assign(Discount=df.price * df.Category.map({'small':0.01}).fillna(0.02))
Out[67]:
  Category  ID  price  Discount
0    small   1     25      0.25
1   medium   2     30      0.60
2   medium   3     34      0.68
3    small   4     40      0.40

推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
author-avatar
手机用户2502929183
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有