使用df ['C']与df.loc [:,'C']在Pandas数据框中分配新列

时间:2018-11-21 15:44:23

标签: python-3.x pandas dataframe

我有一个数据框:

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列的查看/复制方面有什么区别?用E填充zero列是正确的方法吗? 我有一个具有相同数据和逻辑的相似数据框(只是在另一个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

1 个答案:

答案 0 :(得分:0)

SettingWithCopyWarning是与链接分配的可能性有关的警告。在docs的“返回视图与副本”中,它指出“链接的分配警告/异常旨在将可能无效的通知告知用户。可能存在误报;链接的分配是不经意地报告。”

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

对于您而言,警告肯定是假阳性,因为您是在原始数据框中定义新列(而不是使用数据框的副本)。

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