给出以下代码
df1 = pd.DataFrame({
'name': ['a', 'b'],
'age': [1, 2]
})
df2 = pd.DataFrame({
'name': ['a'],
'age': [3]
})
df1.update(df2)
df1变为
name age
0 a 3.0
1 b 2.0
但是我想要的是
name age
0 a 3
1 b 2
我可以做df1['age'] = df1['age'].astype(np.int64)
,但感觉有点尴尬,尤其是在有更多列的情况下。
有没有更好/更简洁的方法可以做到这一点?
答案 0 :(得分:0)
一个想法是使用原始dtypes并传递给DataFrame.astype
:
d = df1.dtypes
df1.update(df2)
df1 = df1.astype(d)
print (df1)
name age
0 a 3
1 b 2
如果需要通过name
解决方案更新行失败,因为使用索引进行匹配,请检查已编辑的数据:
df1 = pd.DataFrame({
'name': ['a', 'b'],
'age': [1, 2]
})
df2 = pd.DataFrame({
'name': ['a','c','b'],
'age': [3,4,8]
})
d = df1.dtypes
df1.update(df2)
df1 = df1.astype(d)
print (df1)
name age
0 a 3
1 c 4 <- replaced by index 1 both values
正确的解决方案由name
设置索引:
d = df1.dtypes
df11 = df1.set_index('name')
df22 = df2.set_index('name')
df11.update(df22)
df1 = df11.reset_index().astype(d)
print (df1)
name age
0 a 3
1 b 8 <- replaced by index 'b'