在 Pandas DataFrame 操作中用链接替换 `.loc` 方法的更有效方法

问题描述 投票:0回答:2

我目前正在开发一个项目,需要在 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 的方法链世界非常陌生。

python python-3.x pandas dataframe chaining
2个回答
0
投票

代码

创建条件并使用

mask
功能。

cond = df_init['City'].eq('New York') & df_init['Name'].eq('Alice')
out = 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

0
投票

我会用

where

df_init.assign(City=lambda d: d['City'].mask(d['City'].eq('New York')&d['Name'].eq('Alice'), 'Hamburg'))
© www.soinside.com 2019 - 2024. All rights reserved.