Python 基于条件更新数据帧列的有效方法

Python 基于条件更新数据帧列的有效方法,python,pandas,dataframe,Python,Pandas,Dataframe,如果第二帧的条件适用,我想更新一个数据帧的值 现在,我正在循环第二帧的每一行,以找到它在第一帧中的位置,并在找到该行时更新该行,但这是非常缺乏资源的 有更好的合并方法吗 例如,我想将T2中的值在T1中更新为“是” T1 user_id version issue Resolved 1 12345 crash no 2 12346 printing no

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

现在,我正在循环第二帧的每一行,以找到它在第一帧中的位置,并在找到该行时更新该行,但这是非常缺乏资源的

有更好的合并方法吗

例如,我想将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

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

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循环了

在联合收割机第一次不工作的地方检查此解决方案。我创建了“是”的贴图,并将其应用于第一帧:

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)

有点困惑,你说你是循环,但后来提到合并。为什么不合并,然后选择更改的值呢?我是循环,我的意思是作为一个通用术语合并,但我知道这可能会令人困惑,对此我很抱歉。@DiSt8885我找到了一种缩短它的方法,不需要数据类型或循环,请查看底部我的最新更新。这可能是我的pandas版本中的一个错误,因为它将数字更改为浮点数,除非我添加了.astype标记。我使用0.25.3I可能是错误的,但我进一步研究了这个问题,我注意到combined first似乎使用索引而不是数据作为键值来连接数据。例如:
T1=pd.DataFrame({'A':[1,1,2,3],'B':['no','no','no','no']})T2=pd.DataFrame({'A':[2,3],'B':['yes','yes']})#df3=df1.combine_first(df2)T3=T2.astype('object')。combine_first(T1)T3不在索引2和3中输入yes,而是替换A列和A列的索引值0和1B@DiSt8885检查我的更新答案,我使用字典将值映射回第一帧。