SettingWithCopyWarning在DataFrame.astype上不合理地发生

时间:2019-02-21 14:18:40

标签: python pandas

这是非常奇怪和烦人的:我有一个Python脚本,其中包含以下DataFrame:

>>> x_pattern
sim_target_id line_on_trench    top     bot orientation session_id
            4              0  sim_1  sim_10   X_overlay          1
           64              0  sim_8  sim_31   X_overlay          1

如果我尝试:

>>> x_pattern['sim_target_id'] = x_pattern['sim_target_id'].astype(int)

一个熟悉的警告将引发:

86: 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
x_pattern['sim_target_id'] = x_pattern['sim_target_id'].astype(int)

但是,如果我在脚本中插入以下行:

df1 = pd.DataFrame({'lkey': ['foo', 'bar', 'baz'],'value': [1, 2, 3],'ccc':['a','vb','c']})
df1.value = df1.value.astype('int')

在df1操作上不会引发“ SettingWithCopyWarning”!

我尝试了推荐的.loc方法-不起作用,我尝试就地输入类型-不起作用。有人可以帮我吗?

附录-如何创建数据框: DataFrame是从sqlite数据库创建的:

sqlite_path = 'xxx'

engine2 = create_engine('sqlite:///{}'.format(sqlite_path))
connection2 = engine2.connect()

resoverall = connection2.execute("SELECT \ 
             sim_target_id,line_on_trench,top,bot,orientation,session_id \
                                FROM \
                                sim_targets \
                                WHERE \
                                sim_target_id In ({});".format(','.join(selected_id))) #pattern info
sim_targets = pd.DataFrame(resoverall.fetchall())
sim_targets.columns = resoverall.keys()
print sim_targets.dtypes
x_pattern = sim_targets[(sim_targets['orientation']=='X_overlay')&(sim_targets['sim_target_id'].isin(x_sim_id))]
print x_pattern
x_pattern['sim_target_id'] = x_pattern['sim_target_id'].astype(int)

输出将是:

sim_target_id     object
line_on_trench    object
top               object
bot               object
orientation       object
session_id        object
dtype: object
  sim_target_id line_on_trench    top     bot orientation session_id
0             4              0  sim_1  sim_10   X_overlay          1
1            64              0  sim_8  sim_31   X_overlay          1
test.py:37: 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
  x_pattern['sim_target_id'] = x_pattern['sim_target_id'].astype(int)

我只是尝试手动输入DataFrame而警告不会出现。但是我无法分辨手动df和导入的df之间的区别,它们看起来是一样的-值和dtypes。

0 个答案:

没有答案