【问题标题】:prevent pandas.combine from converting dtypes防止 pandas.combine 转换 dtypes
【发布时间】:2022-09-24 23:09:44
【问题描述】:

不良行为pandas.combine 将整数转换为浮点数。

描述: 我的 DataFrame 包含一个文件名列表(索引)和关于每个文件名的一些元数据:

            pags  rating  tms  glk
name                              
file1  original0       1    1    1
file2  original1       2    2    2
file3  original2       3    3    3
file4  original3       4    4    4
file5  original4       5    5    5

有时我需要更新某些文件的某些列,而使所有其他单元格保持不变。
此外,更新可以包含我需要添加为新行的新文件(可能有一些 N/As)。
更新以另一个 DataFrame upd 的形式出现:

       pags  rating
name               
file4  new0      11
file5  new1      12
file6  new2      13
file7  new3      14

在这里,我想为文件 4,5 更改 pagsrating 并为文件 6,7 添加新行。
我发现我可以用pd.combine 做到这一点:

df = df.combine(upd, lambda old,new: new.fillna(old), overwrite=False)[df.columns]
            pags  rating  tms  glk
name                              
file1  original0     1.0  1.0  1.0
file2  original1     2.0  2.0  2.0
file3  original2     3.0  3.0  3.0
file4       new0    11.0  4.0  4.0
file5       new1    12.0  5.0  5.0
file6       new2    13.0  NaN  NaN
file7       new3    14.0  NaN  NaN

唯一的问题是所有整数列都变成了浮点数。
我如何保留原来的dtypes
我强烈希望避免为每一列手动.astype()

创建此示例的代码

df = pd.DataFrame({
    \'name\': [\'file1\',\'file2\',\'file3\',\'file4\',\'file5\'],
    \'pags\': [\"original\"+str(i) for i in range(5)],
    \'rating\': [1, 2, 3, 4, 5],
    \'tms\': [1, 2, 3, 4, 5],
    \'glk\': [1, 2, 3, 4, 5],
}).set_index(\'name\')

upd = pd.DataFrame({
    \'name\': [\'file4\',\'file5\',\'file6\',\'file7\'],
    \'pags\': [\"new\"+str(i) for i in range(4)],
    \'rating\': [11, 12, 13, 14],
}).set_index(\'name\')

df = df.combine(upd, lambda old,new: new.fillna(old), overwrite=False)[df.columns]
  • 具有 NaN 的列不能是整数列,因为 NaN 是浮点数。

标签: python pandas dataframe


【解决方案1】:

除非我错过了什么,否则您不必投射.astype() 为每一列,整个数据框只有一次,如下所示:

df = (
    df.combine(upd, lambda old, new: new.fillna(old), overwrite=False)[df.columns]
    .fillna(0)
    .astype(int, errors="ignore")
)
print(df)
# Output
            pags  rating  tms  glk
name
file1  original0       1    1    1
file2  original1       2    2    2
file3  original2       3    3    3
file4       new0      11    4    4
file5       new1      12    5    5
file6       new2      13    0    0
file7       new3      14    0    0

【讨论】:

    猜你喜欢
    • 2013-05-01
    • 2012-12-22
    • 1970-01-01
    • 2016-12-06
    • 2011-11-12
    • 2016-03-27
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多