我有一个数据框:
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
在C
和D
列的查看/复制方面有什么区别?用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
答案 0 :(得分:0)
SettingWithCopyWarning
是与链接分配的可能性有关的警告。在docs的“返回视图与副本”中,它指出“链接的分配警告/异常旨在将可能无效的通知告知用户。可能存在误报;链接的分配是不经意地报告。”
运行代码(使用pandas==0.23.4
和Python 2.7.15
)时,我无法重现此警告。您可能正在运行其他版本的pandas
吗? This post似乎表明这是pandas
版本的问题。如果您升级pandas
版本,则可能不会显示警告,并且分配新列的两种方式(df.loc[:,'C']
或df['C']
)均有效。确保您的python
,pandas
和numpy
的版本已升级,并且在不同的环境中相同。
对于您而言,警告肯定是假阳性,因为您是在原始数据框中定义新列(而不是使用数据框的副本)。
是的,如果您想用字符串E
填充列zero
,这是一种合适的方法。