修改熊猫数据框中的行的子集


问题内容

假设我有一个熊猫数据框架,其中有两列,即A和B。我想修改此DataFrame(或创建一个副本),以便每当A为0时B始终为NaN。我将如何实现?

我尝试了以下

df['A'==0]['B'] = np.nan

df['A'==0]['B'].values.fill(np.nan)

没有成功。


问题答案:

使用.loc基于标签索引:

df.loc[df.A==0, 'B'] = np.nan

df.A==0表达式创建一个布尔系列,该布尔系列对行进行索引并'B'选择列。您还可以使用它来转换列的子集,例如:

df.loc[df.A==0, 'B'] = df.loc[df.A==0, 'B'] / 2

我对pandas内部没有足够的了解,无法确切知道为什么这样做,但是基本的问题是有时索引到DataFrame中会返回结果的副本,有时会返回原始对象的视图。根据此处的文档,此行为取决于基础的numpy行为。我发现在一个操作(而不是[one] [two])中访问所有内容更可能用于设置。