【问题标题】:Using df['C'] vs. df.loc[:, 'C'] to assign new column in Pandas dataframe使用 df['C'] 与 df.loc[:, 'C'] 在 Pandas 数据框中分配新列
【发布时间】:2018-11-22 00:46:13
【问题描述】:

我有一个数据框:

df = pd.DataFrame({'A':np.random.randint(1,10, 10), 'B':np.random.randint(1,10, 10)})

def sumf(row):
    result = None
    if row['A']>= row['B']:
        result = row['A'] - row['B']
    else:
        result = row['B'] - row['A']
    return result

df.loc[:,'C'] = df.apply(sumf, axis = 1)
df['D'] = df.apply(sumf, axis = 1)
my_var = 'zero'
df['E'] = my_var

CD 列在查看/复制方面有什么区别?用zero 填充列E 是否正确? 我有一个具有相同数据和逻辑的类似数据框(仅在另一个 jupyter 笔记本中),但我收到警告:

/usr/local/lib/python3.5/dist-packages/ipykernel_launcher.py:19: SettingWithCopyWarning:试图在一个副本上设置一个值 从 DataFrame 切片。尝试使用 .loc[row_indexer,col_indexer] = 取而代之的价值

当我尝试这些行时:

df['D'] = df.apply(sumf, axis = 1)
my_var = 'zero'
df['E'] = my_var

【问题讨论】:

  • 我没有收到此错误。您正在运行的另一段代码是否会导致上游出现此错误?
  • 抱歉,不知道如何将格式化的代码作为评论发布。所以我的生产代码是一样的(除了列名、计算类型和数据)。而且我也没有收到警告(当我运行上面的代码时)但是当我运行我的生产代码时我确实收到了这个警告。

标签: python-3.x pandas dataframe


【解决方案1】:

SettingWithCopyWarning 是与链式分配的可能性相关的警告。从“返回视图与副本”的docs 中,它指出“链式分配警告/异常旨在通知用户可能无效的分配。可能存在误报;无意中报告了链式分配的情况。”

在运行您的代码(使用pandas==0.23.4Python 2.7.15)时,我无法重现此警告。可能您正在运行不同版本的pandasThis post 似乎表明这是一个 pandas 版本问题。如果您升级 pandas 版本,则可能不会出现警告,并且分配新列的两种方式(df.loc[:,'C']df['C'])都有效。确保您的pythonpandasnumpy 版本已升级并且在不同环境中相同。

在您的情况下,警告肯定是误报情况,因为您在原始数据框中定义新列(不使用数据框的副本)。

而且,是的,如果您想用字符串 zero 填充列 E,这是一种合适的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2014-02-07
    • 2018-02-19
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    相关资源
    最近更新 更多