【问题标题】:To prevent automatic type change in Pandas为了防止 Pandas 中的自动类型更改
【发布时间】:2021-10-16 16:25:08
【问题描述】:

我有一个包含 4 列的 excel (.xslx) 文件: pmid(整数) 基因(字符串) 疾病(字符串) 标签(字符串)

我尝试使用 pandas.read_excel 将其直接加载到 python 中


        df = pd.read_excel(path, parse_dates=False)

从 excel 中捕获

使用我的 ide 调试器从 pandas 捕获

如上图,pandas尝试变聪明,自动转换一些gene字段如3.Oct em>, 4.Oct 到日期时间类型。问题是 3.Oct4.Oct 是 Gene type 的缩写,含义完全不同。所以我不希望熊猫这样做。如何防止 pandas 自动转换类型?

【问题讨论】:

    标签: pandas dataframe


    【解决方案1】:

    更新 2

    要保持与 Excel 相同的格式,您可以使用pd.to_datetime 和自定义函数来重新格式化日期。

    # Sample
    >>> df
                      gene
    0               PDGFRA
    1  2021-10-03 00:00:00  # Want: 3.Oct
    2  2021-10-04 00:00:00  # Want: 4.Oct
    
    >>> df['gene'] = pd.to_datetime(df['gene'], errors='coerce') \
                       .apply(lambda dt: f"{dt.day}.{calendar.month_abbr[dt.month]}"
                                  if dt is not pd.NaT else np.NaN) \
                       .fillna(df['gene'])
    
    >>> df
         gene
    0  PDGFRA
    1   3.Oct
    2   4.Oct
    

    更新

    其实没有转换。该值在 Pandas 中显示为2020-10-03 00:00:00,因为它是存储在单元格中的实际值。 Excel 以另一种格式显示此值


    旧答案

    强制dtype=str 阻止 Pandas 尝试转换您的数据框

    df = pd.read_excel(path, dtype=str)
    

    或者使用converters={'colX': str, ...} 映射每列的dtype。

    【讨论】:

    • str 类型不起作用。仍然 pandas 自动将 3.oct 更改为 timeframe
    • 有没有办法读取“实际值”而不是“显示值”?我读取了该值并遇到了查找错误,我需要使用文本“3.Oct”搜索 DB,但输入查询已更改为在程序中引发错误。
    • 真正的值是Pandas显示的值。这就是你已经拥有的 IIUC。你想换成“3. Oct”吗?
    • @KeanuPaik。我更新了我的答案。请检查一下是否符合您的预期?
    • @@Corralien 感谢您的支持。但是,实际数据长度中的基因列超过100,000,但只有一行是有问题的。为了处理这个,我有点不熟悉提前检查所有列是否都是日历。如前所述,如果单元格中的内在价值没有改变,只是外部格式发生了变化,有没有办法读取原始内在价值?
    【解决方案2】:

    pd.read_excel 有一个 dtype 参数,可用于显式指定数据类型。

    【讨论】:

    • 不,它不起作用
    猜你喜欢
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    相关资源
    最近更新 更多