【问题标题】:how to replace elements in a column using pandas如何使用熊猫替换列中的元素
【发布时间】:2013-11-05 19:28:14
【问题描述】:

给定这个数据框:

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

我想用zero 替换value 的元素,但仅限与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,但这显然是错误的。

【问题讨论】:

    标签: python replace pandas


    【解决方案1】:

    你很接近,只需使用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
    

    更新你可以看到documentation关于.ix.loc之间的差异,一些引号:

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

    .iloc 是严格基于整数位置的(从 0 到 length-1 轴),当请求的索引超出时会引发 IndexError 界限...

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

    【讨论】:

    • 谢谢@Roman!从 EdChum 的回答中可以看出 .ix 和 .loc 之间的效率是否存在差异?
    【解决方案2】:

    使用.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
    

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 2019-02-12
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2017-06-08
      • 2020-12-21
      相关资源
      最近更新 更多