我正在尝试根据另一列的条件更新列
df=pd.DataFrame(np.random.randn(6,4),columns=list('abcd'))
df[df.b>0].d=1
为什么这不起作用?没有它的条件。
答案 0 :(得分:7)
当我使用pandas v0.16.1执行此操作时,我会收到警告,告诉我发生了什么:
df=pd.DataFrame(np.random.randn(6,4),columns=list('abcd'))
df[df.b>0].d=1
/home/me/.local/lib/python2.7/site-packages/pandas/core/generic.py:1974: 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 the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
df[df.b > 0]
会创建数据框中不再链接到原始数据框的那些行的副本。根据警告中的建议,如果我这样做:
df.loc[df.b > 0, 'd'] = 1
我得到了预期的结果:
df
Out[10]:
a b c d
0 -0.127010 0.252527 -0.857680 1.000000
1 0.348888 0.780728 -0.710778 1.000000
2 0.840746 -0.456552 0.414482 -1.326191
3 0.864530 0.365728 -0.540530 1.000000
4 1.954639 -0.919998 -0.446927 1.949182
5 -0.928344 -0.145271 0.089434 -0.569934