gpt4 book ai didi

python - 根据另一个 DataFrame 的公共(public)列过滤和替换一个 Pandas DataFrame 中的值

转载 作者:行者123 更新时间:2023-12-04 16:23:50 27 4
gpt4 key购买 nike

我有一个关于 Pandas 以及正确索引和替换值的问题。

我有 2 个 DataFrame,df1 和 df2,具有相同的列(Col1、Col2、Col3 和 Col4)。

df1 = pd.DataFrame([['A','b','x',1], ['A','b','y',2], ['A','c','z',3], ['B','b','x',4]], columns=['Col1', 'Col2', 'Col3', 'Col4'])
df2 = pd.DataFrame([['A','b','y',0], ['B','b','x',0]], columns=['Col1','Col2','Col3','Col4'])

df1
Col1 Col2 Col3 Col4
0 A b x 1
1 A b y 2
2 A c z 3
3 B b x 4

df2
Col1 Col2 Col3 Col4
0 A b y 0
1 B b x 0

df1 中,我想替换 Col4 中与 其他列 的值匹配的行中的值(Col1, df2 中的 Col2 和 Col3) 具有另一个值(比如 100)。

生成的 df1 如下所示:

df1
Col1 Col2 Col3 Col4
0 A b x 1
1 A b y 100
2 A c z 3
3 B b x 100

我尝试过这样的事情:

columns = list(df1.columns)    
columns.remove('Col4')
df1.loc[(df1[cols] == df2[cols].values).all(axis=1)]['Col4']=100

但是我遇到了错误,我不确定这是否达到了我想要的效果。

最佳答案

您可以使用索引执行 isin,并通过 bool 掩码分配值:


cols = ['Col1', 'Col2', 'Col3']

temp1 = df1.set_index(cols)

temp2 = df2.set_index(cols)

# get the booleans here
booleans = temp1.index.isin(temp2.index)


# this assigns 100 to only rows in Col4
# that are True
df1.loc[booleans, 'Col4'] = 100

df1

Col1 Col2 Col3 Col4
0 A b x 1
1 A b y 100
2 A c z 3
3 B b x 100

或者,您可以使用 pd.mergeindicator 参数来解决它:

(df1.merge(df2, 
on = cols,
how = 'left',
indicator=True,
suffixes = (None, '_y'))
.assign(Col4 = lambda df: np.where(df._merge == 'both',
100,
df.Col4))
.loc[:, df1.columns]
)

Col1 Col2 Col3 Col4
0 A b x 1
1 A b y 100
2 A c z 3
3 B b x 100

关于python - 根据另一个 DataFrame 的公共(public)列过滤和替换一个 Pandas DataFrame 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69189717/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com