Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:使用布尔掩蔽和索引指定值_Python_Pandas - Fatal编程技术网

Python 熊猫:使用布尔掩蔽和索引指定值

Python 熊猫:使用布尔掩蔽和索引指定值,python,pandas,Python,Pandas,考虑以下玩具示例: df = pd.DataFrame([0,1,2,3,4,5,6], columns=['Value']) df_subset = df.loc[[3,4,5]] df.loc[df.Value % 2 == 0, 'Value'] = df_subset.Value * 10 分配前df: 0 一, 二, 三, 四, 五, 六, df分配后: 楠 一, 楠 三, 四十 五, 楠 发生这种情况的原因如下: 仅修改掩码/布尔索引为真的项,即仅修改偶数元素 这就是为什么i

考虑以下玩具示例:

df = pd.DataFrame([0,1,2,3,4,5,6], columns=['Value'])
df_subset = df.loc[[3,4,5]]

df.loc[df.Value % 2 == 0, 'Value'] = df_subset.Value * 10
分配前df:

  • 0
  • 一,
  • 二,
  • 三,
  • 四,
  • 五,
  • 六,
  • df分配后:

  • 一,
  • 三,
  • 四十
  • 五,

  • 发生这种情况的原因如下:

    • 仅修改掩码/布尔索引为真的项,即仅修改偶数元素
    • 这就是为什么
      idx=1
      未设置为NaN的原因
    • 任何未出现在右侧索引中的索引都设置为NaN
    然而,我想要实现的是相同的行为,而不将缺少的索引项设置为NaN,即

    • 修改遮罩为真的元素
    • 对于这些元素:如果特定索引是
      df.index
    所需输出:

  • 0
  • 一,
  • 二,
  • 三,
  • 四十
  • 五,
  • 六,

  • 第一个想法是通过
    &
    为按位
    链接两个掩码,因为使用了测试索引:

    或:

    另一个想法是通过原始掩码过滤子集并使用:


    验证的预期输出如何?@jezrael I添加了所需的结果。我认为,如果索引或子组包含数百万个条目,则由于
    isin()
    操作,这将不可行。想详细介绍一下这个话题吗?太好了,我相信
    update()
    正是我想要的。谢谢,我做了一些快速基准测试,结果表明,尽管我最初的直觉是,
    isin()
    variant(16.4毫秒)的速度几乎是
    update()
    variant(29.6毫秒)的两倍,用于包含10^6个条目和一组3*10^4个条目的数据帧(我确保对子组使用
    Int64Index
    而不是
    RangeIndex
    )注意:这不适用于更大的数据帧(10^7和子组3*10^5)。在这种情况下
    update()
    提供了2-3的加速。虽然子组大小似乎几乎不相关,但10^4和3*10^5之间似乎没有任何差异。
    df = pd.DataFrame([0,1,2,3,4,5,6], columns=['Value'])
    df_subset = df.loc[[3,4,5]]
    
    mask = (df.Value % 2 == 0) & (df.index.isin([3,4,5]))
    df.loc[mask, 'Value'] = df_subset.Value * 10
    
    print (df)
       Value
    0      0
    1      1
    2      2
    3      3
    4     40
    5      5
    6      6
    
    df = pd.DataFrame([0,1,2,3,4,5,6], columns=['Value'])
    mask = (df.Value % 2 == 0) & (df.index.isin([3,4,5]))
    df.loc[mask, 'Value'] *= 10
    
    print (df)
       Value
    0      0
    1      1
    2      2
    3      3
    4     40
    5      5
    6      6
    
    df = pd.DataFrame([0,1,2,3,4,5,6], columns=['Value'])
    df_subset = df.loc[[3,4,5]]
    
    df.update(df_subset.loc[df.Value % 2 == 0, 'Value'] * 10)
    
    #alternative
    #df.update(df_subset.loc[df_subset.Value % 2 == 0, 'Value'] * 10)
    
    print (df)
       Value
    0    0.0
    1    1.0
    2    2.0
    3    3.0
    4   40.0
    5    5.0
    6    6.0