【问题标题】:Efficient way to update column value for subset of rows on Pandas DataFrame?为 Pandas DataFrame 上的行子集更新列值的有效方法?
【发布时间】:2018-10-04 18:13:44
【问题描述】:

当使用 Pandas 更新特定行子集的列值时,最好的方法是什么?

简单示例:

import pandas as pd

df = pd.DataFrame({'name' : pd.Series(['Alex', 'John', 'Christopher', 'Dwayne']),
                   'value' : pd.Series([1., 2., 3., 4.])})

目标:根据名称长度和值列本身的初始值更新value列。

以下行实现了目标:

df.value[df.name.str.len() == 4 ] = df.value[df.name.str.len() == 4] * 1000

但是,此行在 LHS 和 RHS 中对整个数据框进行了两次过滤。我认为这不是最有效的方法。它并没有“就地”做到这一点。

基本上我正在寻找相当于 R data.table ':=' 运算符的熊猫:

df[nchar(name) == 4, value := value*1000]

对于其他类型的操作,例如:

df[nchar(name) == 4, value := paste0("short_", as.character(value))]

环境:Python 3.6Pandas 0.22

提前致谢。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你需要loc*=

    df.loc[df.name.str.len() == 4, 'value'] *= 1000
    print (df)
              name   value
    0         Alex  1000.0
    1         John  2000.0
    2  Christopher     3.0
    3       Dwayne     4.0
    

    编辑:

    更通用的解决方案:

    mask = df.name.str.len() == 4
    df.loc[mask, 'value'] = df.loc[mask, 'value'] * 1000
    

    或者:

    df.update(df.loc[mask, 'value'] * 1000)
    

    【讨论】:

    • 感谢@jezrael 的回答。但是,如果这不是像我公开的第二个 R 案例那样简单的乘法,那会是怎样的呢?
    • 嗯,那么可以使用缓存掩码并将您的解决方案与loc 一起使用或使用update
    【解决方案2】:

    这可能是您需要的:

     df.loc[df.name.str.len() == 4, 'value'] *= 1000
    
     df.loc[df.name.str.len() == 4, 'value'] = 'short_' + df['value'].astype(str)
    

    【讨论】:

    • 感谢@jp_data_analysis。那工作得很好。您愿意解释或指出为什么 RHS 上的 df['value'] 会被行子集过滤吗?使用.loc 有什么用?
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 2013-07-07
    • 2012-11-03
    • 2021-10-05
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多