【问题标题】:SettingwithcopyWarning: while try to use .sort_values in pandasSettingwithcopyWarning:尝试在 pandas 中使用 .sort_values
【发布时间】:2020-05-06 08:31:35
【问题描述】:

我正在尝试按总列对数据框进行排序:

df.sort_values(by='Total', ascending=False, axis=0, inplace =True)

但我收到以下警告:

/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  """Entry point for launching an IPython kernel.

当我点击链接时,它会打开并建议使用.loc 方法。但在那之后,我关注了.sort_values(),在那里我发现使用 inplace = False 或 None。

我的问题是,如果我有一个未排序的数据框列,并且如果我不使用 inplace = True,我的数据框将被排序以供进一步使用,或者我必须为数据框分配一个新名称并保存它。

【问题讨论】:

  • 我遇到了完全相同的问题,我不认为 inplace = True 应该这样做,但我对此很不屑一顾,所以我犹豫说这是一个错误,它看起来像它给我。我放弃了就地,而是分配了数据框,一切都很好。 inplace 确实在您提供的链接上支持 True
  • @JulianMoore 同意。这是我眼中的一个错误。

标签: python-3.x pandas


【解决方案1】:

警告不明确,但如果您在通过过滤另一个 df 创建 df 时将 .copy() 与 .loc 结合使用,则警告应该会消失。

import pandas as pd

df = pd.DataFrame({'num':range(10),'Total':range(20,30)})
# loc without copy
df_2 = df.loc[df.num <5]

df_2.sort_values(by='Total', ascending=False, axis=0, inplace =True)
# leads to SettingWithCopyWarning

df_3 = df.loc[df.num <5].copy()
df_3.sort_values(by='Total', ascending=False, axis=0, inplace =True)
# no warning

您会发现更多详细信息here,但有一类非常烦人的 Pandas 错误,带有复制警告的设置试图保护您免受这些错误的影响。

df_4 = df.copy()
df_4['new_col'] = df_4.num *2
df_5 = df
df_5['new_col_2'] = df_5.num *3 

# df_5's column is also added to df, but not df_4, because of .copy()
df.columns
#Index(['num', 'Total', 'new_col_2'], dtype='object')

df[df.num <2].loc[:,['Total']] = 100
df.Total.max()
# still 29, because of the chained .locs, Total was not updated.
df.loc[df.num<2,'Total'] = 100
df.Total.max()
# 100

【讨论】:

    【解决方案2】:

    我会避免就地操作并像这样存储排序的数据帧:

    df_cp = df.copy() #optional copy of the original df
    df_sort = df.sort_values(by='Total', ascending=False, axis=0)
    del df #deleting df if it's not needed
    

    我遇到过看起来像错误的复制警告,所以目前我更喜欢避免可能触发它们的语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-16
      • 2020-07-10
      • 2016-10-16
      • 2016-07-03
      • 2021-11-20
      • 2021-11-07
      • 2014-12-30
      相关资源
      最近更新 更多