4

给定这个数据框:

>>> a = pd.DataFrame(data={'words':['w1','w2','w3','w4','w5'],'value':np.random.rand(5)})
>>> a

     value   words
0  0.157876    w1
1  0.784586    w2
2  0.875567    w3
3  0.649377    w4
4  0.852453    w5

>>> b = pd.Series(data=['w3','w4'])
>>> b

0    w3
1    w4

我想替换 with 的元素,valuezero仅限于与b. 因此,生成的数据框应如下所示:

    value    words
0  0.157876    w1
1  0.784586    w2
2  0           w3
3  0           w4
4  0.852453    w5

我想到了一些类似的东西:a.value[a.words==b] = 0但这显然是错误的。

4

2 回答 2

5

你很接近,只需使用pandas.Series.isin()而不是==

>>> a.value[a['words'].isin(b)] = 0
>>> a
      value words
0  0.340138    w1
1  0.533770    w2
2  0.000000    w3
3  0.000000    w4
4  0.002314    w5

或者你可以使用ix选择器:

>>> a.ix[a['words'].isin(b), 'value'] = 0
>>> a
      value words
0  0.340138    w1
1  0.533770    w2
2  0.000000    w3
3  0.000000    w4
4  0.002314    w5

更新您可以看到有关差异的文档.ix.loc一些引号:

.loc是严格基于标签的,当找不到项目时会引发 KeyError ...

.iloc是严格基于整数位置的(从轴的 0 到长度-1),当请求的索引超出范围时将引发 IndexError ...

.ix支持混合整数和基于标签的访问。它主要基于标签,但将回退到整数位置访问。.ix 是最通用的,将支持 .loc 和 .iloc 的任何输入,以及对浮点标签方案的支持。.ix 在处理混合位置和基于标签的层次索引时特别有用......

于 2013-11-05T19:36:04.493 回答
3

用于.loc选择要分配给的列值:

a.loc[a.words.isin(b),'value']=0

Out[10]:

      value words
0  0.065556    w1
1  0.776099    w2
2  0.000000    w3
3  0.000000    w4
4  0.331185    w5
于 2013-11-05T19:34:49.057 回答