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