当前位置: 首页 > 知识库问答 >
问题:

Python熊猫数据帧:为数据帧的两列分配函数返回元组

岳正浩
2023-03-14

我想使用返回元组的函数将两列添加到数据帧中,如下所示:

data=pd.DataFrame({'a':[1,2,3,4,5,6],'b':['ssdfsdf','bbbbbb','cccccccccccc','ddd','eeeeee','ffffff']})

def givetup(string):
    
    result1 = string[0:3]
    # please imagine here a bunch of string functions concatenated.
    # including nlp methods with SpaCy 
    result2 = result1.upper()
    # the same here, imagine a bunch of steps to calculate result2 based on result 1
    
    return (result1,result2)

data['c'] = data['b'].apply(lambda x: givetup(x)[0])
data['d'] = data['b'].apply(lambda x: givetup(x)[1])

这是非常低效的(我正在处理数百万行),因为我调用了两次相同的函数并进行了两次计算。既然result2依赖于result 1我最好不要将givetup分为两个函数,我如何在只调用一次函数的情况下一次性将result1result2分配到新的列c和d中?最有效的方法是什么?

请记住,result1result2是非常耗时的字符串计算。

编辑1:我知道这个:对列应用pandas函数来创建多个新列?

i、 e.应用矢量化函数。在我的特殊情况下,这是非常不可取的,甚至是不可能的。假设结果1和结果2是基于语言模型计算的,我需要纯文本。


共有3个答案

微生毅然
2023-03-14

另一种方法是将应用函数用于系列:

import pandas as pd

data=pd.DataFrame({'a':[1,2,3,4,5,6],'b':['ssdfsdf','bbbbbb','cccccccccccc','ddd','eeeeee','ffffff']})

def givetup(column):
    
    column1 = column[0:3]
    column2 = column[0:3].upper()
    
    return pd.Series([column1, column2])

data[['c','d']] = data['b'].apply(lambda x: givetup(x))
欧照
2023-03-14

您可以在此处尝试列表理解:

data[['c','d']] = [givetup(a) for a in data['b']]

输出:

   a             b    c    d
0  1       ssdfsdf  ssd  SSD
1  2        bbbbbb  bbb  BBB
2  3  cccccccccccc  ccc  CCC
3  4           ddd  ddd  DDD
4  5        eeeeee  eee  EEE
5  6        ffffff  fff  FFF
公良骁
2023-03-14
data['c'], data['d'] = zip(*map(givetup, data['b']))

data

   a             b    c    d
0  1       ssdfsdf  ssd  SSD
1  2        bbbbbb  bbb  BBB
2  3  cccccccccccc  ccc  CCC
3  4           ddd  ddd  DDD
4  5        eeeeee  eee  EEE
5  6        ffffff  fff  FFF

这是特定于givetup中给出的示例的。但如果有可能解开这个谜团,那么它可能是值得的。

assign方法参数可以采用引用参数jus previor(NEAT)中创建的列的calable。

data.assign(c=lambda d: d.b.str[0:3], d=lambda d: d.c.str.upper())

   a             b    c    d
0  1       ssdfsdf  ssd  SSD
1  2        bbbbbb  bbb  BBB
2  3  cccccccccccc  ccc  CCC
3  4           ddd  ddd  DDD
4  5        eeeeee  eee  EEE
5  6        ffffff  fff  FFF
data = pd.concat([data] * 10_000, ignore_index=True)

%timeit data['c'], data['d'] = zip(*map(givetup, data['b']))
%timeit data[['c','d']] = [givetup(a) for a in data['b']]
%timeit data.assign(c=lambda d: d.b.str[0:3], d=lambda d: d.c.str.upper())

69.7 ms ± 865 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
137 ms ± 937 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
34.6 ms ± 235 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
 类似资料:
  • 我正在尝试连接到数据帧。它们看起来像这样 期望的最终目标是: 我一直试图使用pd.merge和。连接函数与on='外'设置不成功

  • 我有两个数据帧,是位置的位置,是站点的位置。我正试图找到一种更有效的方法来应用距离函数来查找在特定范围内的站点并返回站点名称。如果距离函数是纬度差,这是我的预期结果: 我有一个解决方案,使用笛卡尔产品/交叉连接在单个数据帧上应用一个函数。这个解决方案是可行的,但是我在一个真正的数据集中有数百万行,这使得笛卡尔产品非常慢。 我还尝试了使用的循环方法,但这比交叉连接方法慢。是否有一种更为通灵/高效的方

  • 这似乎是非常基本的知识,但我还是卡住了,尽管我有一些数据处理的理论背景(通过其他软件)。值得一提的是,我是蟒蛇和熊猫图书馆的新手。 我的任务是将系列名称列的值作为单独的列(从长到宽转换)。我花了很长时间尝试不同的方法,但只有错误。 例如: 我犯了一个错误: ...很多短信...通过值的长度是2487175,索引暗示2 有谁能指导我完成这个过程吗?谢谢 它用于代码“mydata=mydata”。pi

  • 假设熊猫数据帧如下所示: 如何将第三行(如row3)提取为pd数据帧?换句话说,row3.shape应该是(1,5),row3.head()应该是:

  • 我有这个熊猫数据框 这就给了我: 我该怎么办 做一个新的人物, 将标题添加到图"标题这里" 以某种方式创建一个映射,这样标签不是29,30等,而是“29周”,“30周”等。 将图表的较大版本保存到我的计算机(例如10 x 10英寸) 这件事我已经琢磨了一个小时了!

  • 我对熊猫有些陌生。我有一个熊猫数据框,是一行23列。 我想把它转换成一个系列?我想知道做这件事最像蟒蛇的方式是什么? 我试过pd。系列(我的结果),但它抱怨。它还没有聪明到意识到它仍然是数学术语中的“向量”。 谢谢!