当列是现有列的布尔测试时,为什么向Pandas DataFrame添加列会返回SettingWithCopy警告?

时间:2015-07-30 03:01:09

标签: python pandas

我在现有的SettingWithCopy警告问题中找不到对此的答案,因为常见的.loc解决方案似乎不适用。我正在将表加载到pandas中,然后尝试根据其他列中的值创建一些掩码列。出于某种原因,即使我将测试包装在SettingWithCopy构造函数中,也会返回pd.Series警告。

这是相关代码。最后的输出似乎是正确的,但有人知道会导致这种情况吗?

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])

谢谢!

2 个答案:

答案 0 :(得分:1)

我猜invs会引发警告。要解决此问题,请将其明确复制,如下所示:

invs = all_invs[all_invs['uniqueIDs'].str.contains('p1')].copy()

答案 1 :(得分:0)

这是this post所选答案的副本。

出现此警告是因为您的数据框x是切片的副本。这不容易知道为什么,但它与你如何达到它的当前状态有关。

您可以通过执行

从x中创建正确的数据帧
x = x.copy()

这会删除警告,但这不是正确的方法

您应该使用DataFrame.loc方法,如警告所示,如下所示:

x.loc[:,'Mass32s'] = pandas.rolling_mean(x.Mass32, 5).shift(-2)