【问题标题】:Why does a string cause entire pandas DataFrame to be non-numerical?为什么一个字符串会导致整个 pandas DataFrame 是非数字的?
【发布时间】:2021-01-11 14:17:19
【问题描述】:

如果我使用数值创建 pandas DataFrame,这会反映在 DataFrame 中。但是,如果第一个元素是字符串,即'a',则整个 DataFrame 变为灰色,并且其中的所有数字都转换为字符串,即3 变为'3'。为什么以及如何保持数据类型的多样性?

import numpy as np
import pandas as pd

AA= pd.DataFrame(np.asarray([1,2,3]))
AA2 = pd.DataFrame(np.asarray(['a','b',3]))

输出是

【问题讨论】:

    标签: python pandas string dataframe


    【解决方案1】:

    第一个问题是使用np.asarray(['a','b',3]所有数据都转换为字符串、对象。

    AA2 = pd.DataFrame(np.asarray(['a','b',3]))
    print (AA2.dtypes)
    0    object
    dtype: object
    
    print (AA2[0].apply(lambda x: type(x)))
    0    <class 'str'>
    1    <class 'str'>
    2    <class 'str'>
    Name: 0, dtype: object
    

    如果通过列表得到混合数据 - 数字和字符串:

    AA2 = pd.DataFrame(['a','b',3])
    
    print (AA2.dtypes)
    0    object
    dtype: object
    
    print (AA2[0].apply(lambda x: type(x)))
    0    <class 'str'>
    1    <class 'str'>
    2    <class 'int'>
    Name: 0, dtype: object
    

    但是使用混合值是有问题的,大多数数值运算都失败了,所以最好避免它。

    【讨论】:

      【解决方案2】:

      这样做没有意义。如果您需要在列中具有特殊含义的一些数字,请改用为该含义保留的常量值:

      NumberA = 1001
      NumberB = 1002
      

      那么你可以这样做:

      np.asarray([NumberA, NumberB, 3]
      

      无论如何,使用这样的一组值来计算数学运算是很困难的,但至少,你会保持它完全是数字的。

      【讨论】:

      • 如果我需要做数学,我可以自己调用数字列AA2.column_name_for_3。我不会在整个 DataFrame 上工作
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      相关资源
      最近更新 更多