我有一个DataFrame,我要添加几个布尔列。对于每列,我将其初始化为False,然后将一些值设置为True。如果我为一个而另一个执行此操作,则第一个将重新初始化为所有False。例如,
In [170]: df['racedif']=False
In [171]: df['racedif'][~ df.newpers]=df.ptdtrace[~ df.newpers]!=df.ptdtrace.groupby(df.personid).apply(pd.Series.shift)[~ df.newpers]
In [172]: df.racedif.sum()
Out[172]: 28
In [173]: df.sexdif.sum()
Out[173]: 0
In [174]: df['sexdif']=False
In [175]: df['sexdif'][~ df.newpers]=df.pesex[~ df.newpers]!=df.pesex.groupby(df.personid).apply(pd.Series.shift)[~ df.newpers]
In [176]: df.sexdif.sum()
Out[176]: 31
In [177]: df.racedif.sum()
Out[177]: 0
但是如果我在设置值之前首先将它们初始化为False,则不会发生这种情况。
In [203]: df['sexdif']=False
...: df['racedif']=False
...: df['sexdif'][~ df.newpers]=df.pesex[~ df.newpers]!=df.pesex.groupby(df.personid).apply(pd.Series.shift)[~ df.newpers]
...: df['racedif'][~ df.newpers]=df.ptdtrace[~ df.newpers]!=df.ptdtrace.groupby(df.personid).apply(pd.Series.shift)[~ df.newpers]
...:
In [204]: df.sexdif.sum()
Out[204]: 31
In [205]: df.racedif.sum()
Out[205]: 28
为什么会发生这种情况并且这是一个错误?
添加了一个没有相同问题的简单示例。为什么?的
In [255]: df.x=False
In [256]: df.x[df.is456]=df['truth'][df.is456]
In [257]: df.x
Out[257]:
0 False
1 False
2 False
3 False
4 True
5 True
6 True
7 False
8 False
9 False
Name: x, dtype: bool
In [258]: df.y=False
In [259]: df.y[df.is456]=df['truth'][df.is456]
In [260]: df.y
Out[260]:
0 False
1 False
2 False
3 False
4 True
5 True
6 True
7 False
8 False
9 False
Name: y, dtype: bool
In [261]: df.x
Out[261]:
0 False
1 False
2 False
3 False
4 True
5 True
6 True
7 False
8 False
9 False
Name: x, dtype: bool
非链式索引
In [281]: df.loc[:,'sexdif']=False
In [282]: df.sexdif.sum()
Out[282]: 0
In [283]: df.loc[:,'sexdif'][~ df.newpers]=df.pesex[~ df.newpers]!=df.pesex.groupby(df.personid).apply(pd.Series.shift)[~ df.newpers]
In [284]: df.sexdif.sum()
Out[284]: 31
In [285]: df.loc[:,'racedif']=False
In [286]: df.sexdif.sum()
Out[286]: 0
答案 0 :(得分:3)
您是链式索引,请参阅此处的文档:http://pandas-docs.github.io/pandas-docs-travis/indexing.html#indexing-view-versus-copy
底线是使用
df.loc[row_indexer,col_indexer] = value
分配而不是
df[col_indexer][row_indexer] = value