为什么我在创建几个布尔系列时会遇到奇怪的行为?

时间:2014-04-17 20:34:32

标签: python pandas

我有一个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

1 个答案:

答案 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