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