如何将函数的 return 值写入 pandas 数据框的新列
How to write a return value of a function into new column of a pandas dataframe
我有一个 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 的新列,与相应行位于相同的索引位置。
我必须更改什么才能以所需方式将生成的子字符串写入新列?
编辑
顺便说一句,我曾尝试编写一个 lambda 表达式,如 how to compute a new column based on the values of other columns in pandas - python 中所示,但我无法真正弄清楚如何在矢量化函数中完成所有操作。
我也尝试用任何东西替换子字符串(如 df.column.replace('x,?', '')
中所示,但这不起作用,因为我必须稍后计算列表。因此必须删除子字符串,如 list.remove('substring')
为什么不使用单行正则表达式解决方案:
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
我有一个 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 的新列,与相应行位于相同的索引位置。
我必须更改什么才能以所需方式将生成的子字符串写入新列?
编辑
顺便说一句,我曾尝试编写一个 lambda 表达式,如 how to compute a new column based on the values of other columns in pandas - python 中所示,但我无法真正弄清楚如何在矢量化函数中完成所有操作。
我也尝试用任何东西替换子字符串(如 df.column.replace('x,?', '')
中所示,但这不起作用,因为我必须稍后计算列表。因此必须删除子字符串,如 list.remove('substring')
为什么不使用单行正则表达式解决方案:
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