根据条件更新数据框列的有效方法

时间:2019-12-06 23:51:06

标签: python pandas dataframe

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

现在,我遍历第二帧的每一行,以找到它在第一帧中的位置,并在找到该行时对其进行更新,但这非常浪费资源。

是否有更好的合并方法?

例如,对于在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

1 个答案:

答案 0 :(得分:2)

您可以在新数据中添加“是”,然后将两者合并

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)