Python 同时使用.loc和.replace()

Python 同时使用.loc和.replace(),python,pandas,dictionary,Python,Pandas,Dictionary,如何根据字典更新数据框的列值 例如,我的df看起来像: df=pd.DataFrame({'B':[100101102103],'E':pd.Categorical([“测试”,“训练”,“测试”,“训练]),'F':[12830012052000]}) Out[28]: B E F 0 100 test 128 1 101 train 300 2 102 test 1205 3 103 train 2000 dict={300:30

如何根据字典更新数据框的列值

例如,我的df看起来像:
df=pd.DataFrame({'B':[100101102103],'E':pd.Categorical([“测试”,“训练”,“测试”,“训练]),'F':[12830012052000]})

Out[28]:

     B      E     F
0  100   test   128
1  101  train   300
2  102   test  1205
3  103  train  2000
dict={300:3012000:2001}

df.loc[df['B'].isin([101103])。替换(dict)

这会给出正确的结果,但在原地执行此操作会发出复制警告,我需要使用此逻辑更新原始数据帧

此外,执行一个效率非常低的
groupby
&
apply
组合虽然有效,但显然不是最优的


如何完成此操作?

您可以将结果分配回数据帧的相同位置:

d = {300:301, 2000:2001}  
mask = df.B.isin([101, 103])  
df.loc[mask] = df.loc[mask].replace(d)

df
#     B     E      F
#0  100 test    128
#1  101 train   301
#2  102 test    1205
#3  103 train   2001
或者您可以使用
更新

df.update(df.loc[df.B.isin([101, 103])].replace(d))

您可以将结果分配回数据帧的相同位置:

d = {300:301, 2000:2001}  
mask = df.B.isin([101, 103])  
df.loc[mask] = df.loc[mask].replace(d)

df
#     B     E      F
#0  100 test    128
#1  101 train   301
#2  102 test    1205
#3  103 train   2001
或者您可以使用
更新

df.update(df.loc[df.B.isin([101, 103])].replace(d))

谢谢,我以前从未使用过
update
。另外,我刚刚意识到,
replace
如何知道该对哪个列执行操作?它从来没有明确说过……它只是应用于df中的每个值吗?如果是这样的话,是否有一种方法可以仅应用于特定列以防万一?您可以将列名添加到
loc
进行子集设置,并仅替换这些列,例如
df.update(df.loc[mask,cols].replace(d))
df.loc[mask,cols]=df.loc[mask,cols].replace(d)
假设
cols
是列名列表,例如
cols=['F']
。另外,谢谢,您的解决方案将我的整数转换为浮点数,知道为什么吗?您尝试过赋值选项了吗?update方法可能使用生成NAN的中间进程,该进程将数据类型从int转换为float。我会这样做。谢谢。谢谢,我以前从未使用过
update
。另外,我刚刚意识到,
replace
如何知道该对哪个列执行操作?它从来没有明确说过……它只是应用于df中的每个值吗?如果是这样的话,是否有一种方法可以仅应用于特定列以防万一?您可以将列名添加到
loc
进行子集设置,并仅替换这些列,例如
df.update(df.loc[mask,cols].replace(d))
df.loc[mask,cols]=df.loc[mask,cols].replace(d)
假设
cols
是列名列表,例如
cols=['F']
。另外,谢谢,您的解决方案将我的整数转换为浮点数,知道为什么吗?您尝试过赋值选项了吗?update方法可能使用生成NAN的中间进程,该进程将数据类型从int转换为float。我会这样做。谢谢