我在现有的SettingWithCopy
警告问题中找不到答案,因为常见的.loc
解决方案似乎不适用。我正在将一个表加载到pandas中,然后尝试根据其他列中的值创建一些掩码列。由于某种原因,即使我将测试包装在pd.Series
构造函数中,也会返回SettingWithCopy
警告。
下面是相关代码。最后的输出似乎是正确的,但有人知道是什么导致了这一点吗?
all_invs = pd.read_table('all_quads.inv.bed', index_col=False,
header=None, names=clustered_names)
invs = all_invs[all_invs['uniqueIDs'].str.contains('p1')]
samples = [line.strip() for line in open('success_samples.list')]
for sample in samples:
invs[sample] = invs['uniqueIDs'].str.contains(sample)
在另一个布尔测试中也会发生。
invs["%s_private_denovo" % proband] = pd.Series(
invs[proband] & ~invs[father] & ~invs[mother] &
invs["%s_private" % proband])
谢谢!
我猜invs
引起了警告。要解决这个问题,像这样显式地复制它:
invs = all_invs[all_invs['uniqueIDs'].str.contains('p1')].copy()
这是这个帖子的选择答案的副本。
出现此警告是因为您的数据框x
是切片的副本。这并不容易知道为什么,但它与你是如何达到目前的状态有关。
你可以通过
从x中创建一个合适的数据框架x = x.copy()
这将删除警告,但是这不是正确的方法!
您应该使用DataFrame.loc
方法,如警告所示,如下所示:
x.loc[:,'Mass32s'] = pandas.rolling_mean(x.Mass32, 5).shift(-2)