首页 > 解决方案 > 根据条件更新数据框列的有效方法

问题描述

如果第二帧的条件适用,我想更新一个数据帧的值。

现在我正在遍历第二帧的每一行以找到它在第一帧中的位置,并在找到它时更新该行,但这是非常低效的资源。

有没有更好的合并方法?

例如,对于在 T2 中找到的值,我想在 T1 中将解析更新为“是”

T1
user_id   version        issue         Resolved
1         12345           crash           no   
2         12346           printing        no 
3         12347           screen          no
3         12348           screen          no


T2
user_id   version        issue 
1         12345           crash              
2         12346           printing              


谢谢!!

预期输出:

T1
user_id   version        issue         Resolved
1         12345           crash           yes   
2         12346           printing        yes 
3         12347           screen          no
3         12348           screen          no

标签: pythonpandasdataframe

解决方案


您可以在新数据中添加一个 yes 解析,然后将两者结合起来

T2['Resolved'] = 'yes'
dtypes = T1.dtypes.combine_first(T2.dtypes)
T3 = T2.combine_first(T1)
for k, v in dtypes.iteritems(): 
    T3[k] = T3[k].astype(v) 

输出:

   user_id  version     issue Resolved
0        1    12345     crash      yes
1        2    12346  printing      yes
2        3    12347    screen       no
3        3    12348    screen       no

我找到了一种无需转换回浮点数的组合方法:

T3 = T2.astype('object').combine_first(T1)

所以你不应该再需要 for 循环了

在 combine_first 不起作用的地方检查这个解决方案。我创建了一个映射到是并将它们应用到第一帧:

T1 = pd.DataFrame({'A': [1,1,2,3], 'B': ['no', 'no','no','no'], 'C': ['no1', 'no2','no3','no4']})
T2 = pd.DataFrame({'A': [2, 3], 'B': ['yes','yes']})
mapitems = T2.set_index('A').to_dict()['B']   
T1['B'] = T1.apply(lambda x: mapitems[x.A] if x.A in mapitems.keys() else x.B, axis=1)

推荐阅读