我目前正在从事一个项目,需要在Pandas DataFrame中执行条件替换.我已经实现了一个解决方案,但我想知道是否有更有效的方法来实现同样的结果.

import pandas as pd

data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Emma'],
    'Age': [25, 30, 35, 40, 45],
    'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df_init = pd.DataFrame(data)

# Using `.loc`
df_init['Group'] = ['A', 'B', 'C', 'D', 'E']
df_init.loc[df_init.loc[
            (df_init.City=='New York')
            &(df_init.Name=='Alice')].index, 'City'] = 'Hamburg' 

# Using method chaining
def _replace(dataframe): 
    dataframe.loc[dataframe.loc[
                 (dataframe.City=='New York')
                 &(dataframe.Name=='Alice')].index, 'City'] = 'Hamburg' 
    return dataframe

(df_init
 .assign(Group=['A', 'B', 'C', 'D', 'E'])
 .pipe(_replace)
)

在第一种方法中,我使用.loc方法来定位满足条件的行,然后执行替换.在第二种方法中,我使用.assign.pipe的方法链接来实现相同的结果.

我的问题是:是否有更有效的方法用Pandas DataFrame操作中的方法链取代.loc方法?我应该提到的是,我对用链条连接Pandas 世界的方法非常陌生.

推荐答案

Code

做出条件并使用mask funcc.

cond = df_init['City'].eq('New York') & df_init['Name'].eq('Alice')
出来 = df_init.assign(
    Group = ['A', 'B', 'C', 'D', 'E'], 
    City=df_init['City'].mask(cond, 'Hamburg')
)

出来

      Name  Age         City Group
0    Alice   25      Hamburg     A
1      Bob   30  Los Angeles     B
2  Charlie   35      Chicago     C
3    David   40      Houston     D
4     Emma   45      Phoenix     E

Python相关问答推荐

如何用symy更新分段函数

根据给定日期的状态过滤查询集

无法使用equals_html从网址获取全文

删除最后一个pip安装的包

Python上的Instagram API:缺少client_id参数"

两个pandas的平均值按元素的结果串接元素.为什么?

mypy无法推断类型参数.List和Iterable的区别

字符串合并语法在哪里记录

删除marplotlib条形图上的底边

如何在FastAPI中为我上传的json文件提供索引ID?

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

在Python中使用if else或使用regex将二进制数据如111转换为001""

Python Pandas—时间序列—时间戳缺失时间精确在00:00

如何按row_id/row_number过滤数据帧

BeautifulSoup-Screper有时运行得很好,很健壮--但有时它失败了::可能这里需要一些更多的异常处理?

当HTTP 201响应包含 Big Data 的POST请求时,应该是什么?  

如何关联来自两个Pandas DataFrame列的列表项?

如何将列表从a迭代到z-以抓取数据并将其转换为DataFrame?

某些值的数值幂和**之间的差异

大Pandas 中的群体交叉融合