Python 同时使用.loc和.replace()
如何根据字典更新数据框的列值 例如,我的df看起来像: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=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。我会这样做。谢谢