我目前正在开发一个项目,需要在 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 的方法链世界非常陌生。
代码
创建条件并使用
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
我会用
where
:
df_init.assign(City=lambda d: d['City'].mask(d['City'].eq('New York')&d['Name'].eq('Alice'), 'Hamburg'))