Mon*_*nty 2 python python-3.x pandas chained-assignment
我一直在四处阅读熊猫文档here并尝试从here和here周围发布的问题中尝试不同的代码行,我似乎无法摆脱带有复制警告的设置。我更愿意学习以“正确”的方式对其进行编码,而不是仅仅忽略警告。
以下代码行在 for 循环中,我不想多次生成此警告,因为它可能会减慢速度。
我正在尝试创建一个名称为:'E'+vs 的新列,其中 vs 是 for 循环中列表中的一个字符串
但是对于他们中的每一个,我仍然收到以下警告,即使是最后 3 行:
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
Run Code Online (Sandbox Code Playgroud)
以下是我迄今为止尝试过的麻烦行:
#based on research, the first two seem to be the "wrong" way
df_out['E'+vs] = df_out[kvs].rolling(v).mean().copy()
df_out['E'+vs] = df_out[kvs].rolling(v).mean()
df_out.loc[:,'E'+vs] = df_out[kvs].rolling(v).mean().copy()
df_out.loc[:,'E'+vs] = df_out[kvs].rolling(v).mean()
df_out.loc[:,'E'+vs] = df_out.loc[:,kvs].rolling(v).mean()
Run Code Online (Sandbox Code Playgroud)
另一个给出 SettingWithCopyWarning 的是这样的:
df_out.dropna(inplace=True,axis=0)
Run Code Online (Sandbox Code Playgroud)
这个也发出了警告(但我认为这个会)
df_out = df_out.dropna(inplace=True,axis=0)
Run Code Online (Sandbox Code Playgroud)
如何正确执行这两个操作?
编辑:这是产生原始 df_out 的代码
df_out= pd.concat([vol.Date[1:-1], ret.Return_Time[:-2], vol.Freq_Time[:-2],
vol.Freq_Time[:-1].shift(-1), vol.Freq_Time[:].shift(-2)],
axis=1).dropna().set_index('Date')
Run Code Online (Sandbox Code Playgroud)
这是一个令人困惑的话题。问题不是您发布的代码。这是您尚未发布的代码。这是生成的代码df_out
考虑此示例并注意生成警告的最后一行。
df_other = pd.DataFrame(dict(A=[1], B=[2]))
df_out = df_other[:]
df_out['E'] = 5
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)//anaconda/envs/3.5/lib/python3.5/site-packages/ipykernel/__main__.py:4: 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: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
现在我们将尝试一个不会产生警告的等效方法
df_other = pd.DataFrame(dict(A=[1], B=[2]))
df_out = df_other.loc[:]
df_out['E'] = 5
Run Code Online (Sandbox Code Playgroud)
然后
print `df_out`
A B E
0 1 2 5
Run Code Online (Sandbox Code Playgroud)
归结为熊猫决定在is_copy基于许多标准构建数据帧时将属性附加到数据帧。
请注意
df_other[:].is_copy
<weakref at 0x103323458; to 'DataFrame' at 0x116a684e0>
Run Code Online (Sandbox Code Playgroud)
什么时候
df_other.loc[:].is_copy
Run Code Online (Sandbox Code Playgroud)
退货 None
那么什么类型的构造会触发复制呢?我仍然不知道一切,甚至我知道的事情对我来说也没有意义。
就像为什么这不会触发它?
df_other[['A', 'B', 'E']].is_copy
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1877 次 |
| 最近记录: |