对数据帧中的列执行 str.split 将返回 SettingWithCopyWarning



我正在尝试拆分一列并仅保留第三项作为列值,使用以下方法

df1['gene_name'] = df1.loc[:,'gene_name'].str.split(';', expand=True)[2]

我也尝试过这些变化

df1['gene_name'] = df1.iloc[:,'gene_name'].str.split(';', expand=True)[2]
df1['gene_name'] = df1.loc[:,'gene_name'].str.split(';', expand=True)[2]
df1['gene_name'] = df1['gene_name'].str.split(';', expand=True)[2]
df1['gene_name'] = df1.gene_name.str.split(';', expand=True)[2]

但它总是返回此警告

find_target_genes.py:19: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df1['gene_name'] = df1.loc[:,'gene_name'].str.split(';', expand=True)[2]

我也尝试使用 4(列索引(代替 gene_names但这会导致错误。

我怎样才能做到这一点? 我已经浏览了文档,但我认为我没有完全理解它,因为我无法弄清楚出了什么问题。

这是我尝试拆分的 2 列的示例(是的,这一切都在一列中(:

ID "A" ; version "B" ; name "C" ; source "D' ;  transcript "C"
ID "A1" ; version "B1" ; name "C1" ; source "D1" ;  transcript "C1"

我希望专栏只说name "C"并摆脱其余的

问题不在作业的右侧,而在于左侧。您使用的是df1['gene_name'],而不是用户指南中建议的df1.loc[:,'gene_name']。使用你的作业,"很难预测它会返回视图还是副本"。根据"阵列的内存布局",可能会发生不好的事情。所以,你应该做:

df1.loc[:,'gene_name'] = df1.loc[:,'gene_name'].str.split(';', expand=True)[2]

我相信当你使用.assign()时,警告会消失。请参阅下面的代码:

df.assign(gene_name = df['gene_name'].str.split(';').str[2])

就我而言,当我从等式的两侧替换它时,警告消失了,因此"df.loc 在两侧都使用......df.loc[:,'column_name']"。

最新更新