如何在不隐式更改列类型的情况下更新DataFrame?

时间:2020-09-17 06:27:30

标签: python pandas dataframe

给出以下代码

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),但感觉有点尴尬,尤其是在有更多列的情况下。 有没有更好/更简洁的方法可以做到这一点?

1 个答案:

答案 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'