【问题标题】:How to write a return value of a function into new column of a pandas dataframe如何将函数的返回值写入熊猫数据框的新列
【发布时间】:2015-12-10 12:18:18
【问题描述】:

我有一个 pandas 数据框,其中包含一个带有字符串的列(即逗号分隔的子字符串)。我想删除一些子字符串并将剩余的子字符串写入同一数据框中的新列。

我为此编写的代码如下所示:

def remove_betas(df):
    for index,row in df.iterrows():
        list= row['Column'].split(',')
        if 'substring' in list:
            list.remove('beta-lactam')
            New= (',').join(list)
        elif not 'substring' in list:
            New= (',').join(Gene_list)
    return New
    df['NewColumn'].iloc[index]=New






 df.apply(remove_betas, axis=1)

当我运行它时,我的新列只包含零。此代码背后的想法是获取 df 中每一行的每个字符串,以逗号将其拆分为子字符串,然后在结果列表中搜索我要删除的子字符串。删除后,我将列表重新组合成一个字符串,并将其写入 df 的新列,与相应行的索引位置相同。

要以所需的方式将生成的子字符串写入新列,我必须进行哪些更改?

编辑

顺便说一句,我曾尝试像 how to compute a new column based on the values of other columns in pandas - python 那样编写 lambda 表达式,但我无法真正弄清楚如何在矢量化函数中执行所有操作。

我也尝试用任何内容替换子字符串(如df.column.replace('x,?', ''),但这不起作用,因为我必须稍后计算列表。因此必须删除子字符串,如list.remove('substring')

【问题讨论】:

  • 我用矢量化的方式更新了解决方案。

标签: python pandas dataframe apply


【解决方案1】:

为什么不使用单行正则表达式解决方案:

import re

df = pd.DataFrame({'col1':[3,4,5],'col2':['a,ben,c','a,r,ben','cat,dog'],'col3':[1,2,3]})

#In [220]: df
#Out[220]:
#   col1     col2  col3
#0     3  a,ben,c     1
#1     4  a,r,ben     2
#2     5  cat,dog     3

df['new'] = df.col2.apply(lambda x: re.sub(',?ben|ben,?', '', x))

#In [222]: df
#Out[222]:
#   col1     col2  col3      new
#0     3  a,ben,c     1      a,c
#1     4  a,r,ben     2      a,r
#2     5  cat,dog     3  cat,dog

或者直接使用replace:

In [272]: df.col2.str.replace(',?ben|ben,?', '',case=False)
Out[272]:
0        a,c
1        a,r
2    cat,dog
Name: col2, dtype: object

【讨论】:

  • 您好,谢谢您的回答。我已经尝试过替换,但这不是一个选项,因为我必须稍后计算列表元素。使用 df.column.replace('x,?', '') 我会在列表中添加一个元素,这意味着即使从列表中“删除”它仍然会被计算在内。
  • 你能解释一下区别吗?我试过你的方法,但正如我所说,当我做df['columnNewNew']=df['new'].apply(lambda x: len(x.split(','))) 时,我仍然得到col2 的长度,而不是“新”长度
  • 有什么区别?抱歉,您在一个问题中提出了很多问题!这不是那么有效......我已经提供了两个不同的答案来解决原始问题(applyvectorized 一个)
  • 我的意思是 sub 和 replace 之间的区别。但我也可以查一下。您的第二个答案有效,谢谢。
猜你喜欢
  • 2019-12-23
  • 2018-05-13
  • 2014-03-28
  • 2014-07-04
  • 2021-06-06
  • 2022-01-21
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多