【问题标题】:How to set dtypes by column in pandas DataFrame如何在 pandas DataFrame 中按列设置 dtypes
【发布时间】:2019-10-31 04:17:50
【问题描述】:

我想将一些数据带入 pandas DataFrame,并且我想在导入时为每一列分配 dtypes。我希望能够为具有许多不同列的较大数据集执行此操作,但是,例如:

myarray = np.random.randint(0,5,size=(2,2))
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype=[float,int])
mydf.dtypes

结果:

TypeError: 数据类型不理解

我尝试了其他一些方法,例如:

mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': int})

TypeError: 'type' 类型的对象没有 len()

如果我输入dtype=(float,int),它会将浮点格式应用于两列。

最后,我希望能够向它传递一个数据类型列表,就像向它传递一个列名列表一样。

【问题讨论】:

  • dtype 的参数应该是有效的 numpy dtype(不支持结构化 dtype),因此 list 或 dict 将不起作用。一种可能的方法是分别为每一列执行 astype。或者首先制作一个结构化的 numpy 数组并将其提供给 DataFrame。
  • 我知道我可以在一个循环中单独分配每个,但我很惊讶 dtype= 不够灵活,无法容纳一个列表。不过感谢您的回答,很高兴得到确认:)
  • github.com/pydata/pandas/issues/4464 目前是一个未解决的问题(如果你想做一个拉取请求会很棒)
  • 只是为了好玩:有人使用 read_csv: stackoverflow.com/a/38524255/6646912 解决了这个问题:D

标签: python pandas types


【解决方案1】:

我刚刚遇到这个问题,熊猫问题仍然存在,所以我发布了我的解决方法。假设df 是我的DataFrame,dtype 是一个将列名映射到类型的字典:

for k, v in dtype.items():
    df[k] = df[k].astype(v)

(注意:在python 2中使用dtype.iteritems()

供参考:

【讨论】:

【解决方案2】:

从 pandas 0.24.2 版(当前稳定版本)开始,无法将数据类型的显式列表作为文档状态传递给 DataFrame 构造函数:

dtype : dtype, default None

    Data type to force. Only a single dtype is allowed. If None, infer

但是,数据框类确实有一个静态方法,允许您将 numpy 结构化数组转换为数据框,因此您可以这样做:

>>> myarray = np.random.randint(0,5,size=(2,2))
>>> record = np.array(map(tuple,myarray),dtype=[('a',np.float),('b',np.int)])
>>> mydf = pd.DataFrame.from_records(record)
>>> mydf.dtypes
a    float64
b      int64
dtype: object

【讨论】:

    【解决方案3】:

    您可能想尝试将 Series 对象的字典传递给 DataFrame 构造函数 - 它可以让您对创建进行更具体的控制,并且希望更清楚发生了什么。模板版本(data1 可以是数组等):

    df = pd.DataFrame({'column1':pd.Series(data1, dtype='type1'),
                       'column2':pd.Series(data2, dtype='type2')})
    

    还有数据示例:

    df = pd.DataFrame({'A':pd.Series([1,2,3], dtype='int'),
                       'B':pd.Series([7,8,9], dtype='float')})
    
    print (df)
       A  B
    0  1  7.0
    1  2  8.0
    2  3  9.0
    
    print (df.dtypes)
    A     int32
    B    float64
    dtype: object
    

    【讨论】:

      【解决方案4】:

      在处理数据类型时,它们应该作为字符串传递。

      例如你遵循的后一种方法应该修改为

      mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': 'int'})

      而不是

      mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': int}).

      dtype (int, float etc.) 应该作为字符串给出。

      或者作为替代方法(如果您不想作为字符串传递) 将 numpy 导入为 np 并使用 mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': np.int})

      【讨论】:

      • 我不明白为什么会有**。那不是正确的语法。把它们拿出来,在mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **np.int**}) 的最后一行,它仍然不起作用:它给出了一个TypeError: data type not understood
      • 你不能将 dict 传递给 dtype 参数
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 2018-07-03
      • 2017-05-05
      • 1970-01-01
      相关资源
      最近更新 更多