如何将函数的返回值写入pandas数据帧的新列

时间:2015-12-10 12:18:18

标签: python pandas dataframe apply

我有一个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')

1 个答案:

答案 0 :(得分: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