【问题标题】:Convert dictionary of dictionaries to dataframe with data types将字典字典转换为具有数据类型的数据框
【发布时间】:2021-02-03 12:56:30
【问题描述】:

将字典字典转换为具有数据类型的数据框的首选方法是什么?

我有以下类型的字典 r,其中包含每个键后面的事实集

import pandas as pd

r = { 1:{'a':1,'b':2,'c':'b'},
      2:{'d':1,'b':1,'c':'b'},
      3:{'e':0} }

将这个字典字典转换为数据框可以通过一种非常简单的方式完成

x = pd.DataFrame(r)
x
x.dtypes

在原始字典中产生以下版本

     1    2    3
a    1  NaN  NaN
b    2    1  NaN
c    b    e  NaN
d  NaN    1  NaN
e  NaN  NaN  0.0

以及列的以下数据类型

1     object
2     object
3    float64
dtype: object

但是,我想在x 上转换版本。这样做之后

y = x.transpose()
y
y.dtypes

数据的预期表示似乎以矩阵形式显示

     a    b    c    d    e
1    1    2    b  NaN  NaN
2  NaN    1    e    1  NaN
3  NaN  NaN  NaN  NaN    0

但是数据类型都是object

a    object
b    object
c    object
d    object
e    object
dtype: object

ry 进行这种转换以便y.dtypes 直接产生数据类型的首选方法是什么

a    float64
b    float64
c    object
d    float64
e    float64
dtype: object

类似于将r 转换为x

【问题讨论】:

    标签: python pandas dataframe dictionary column-types


    【解决方案1】:

    只要设置正确的方向(默认是columns,你想要index)。

    df = pd.DataFrame.from_dict(r, orient='index')
    

    a    float64
    b    float64
    c     object
    d    float64
    e    float64
    dtype: object
    

    【讨论】:

      【解决方案2】:

      pandas >= 1.0.0 你可以使用.convert_dtypes()

      >>> y.convert_dtypes().dtypes
      
      a     Int64
      b     Int64
      c    string
      d     Int64
      e     Int64
      dtype: object
      

      请注意,这使用了新的pandas 字符串类型,并且还将使用pd.NA 来表示缺失值。有一些参数会影响某些转换:

      >>> y.convert_dtypes(convert_string=False).dtypes
      
      a     Int64
      b     Int64
      c    object
      d     Int64
      e     Int64
      dtype: object
      

      如果您有较旧的pandas,您可以使用带有某种循环的pd.to_numericapply,如here

      >>> y = y.apply(pd.to_numeric, errors='ignore') # for columns that fail, do nothing
      >>> y.dtypes
      
      a    float64
      b    float64
      c     object
      d    float64
      e    float64
      dtype: object
      

      我没有看到在没有循环的情况下对整个数据帧强制执行数字类型的方法(.astype() 似乎不起作用,因为错误会导致整个转换失败,或者如果被忽略,则返回原始数据类型)。


      我刚刚看到.transpose()addresses this point的文档:

      当 DataFrame 有混合 dtype 时,我们得到一个带有 object dtype 的转置 DataFrame:

      转置混合类型的 DatraFrame 会返回一个对象类型的 DataFrame。 为了完整起见,这里复制了他们的示例:

      d2 = {'name': ['Alice', 'Bob'],
            'score': [9.5, 8],
            'employed': [False, True],
            'kids': [0, 0]}
      df2 = pd.DataFrame(data=d2)
      df2_transposed = df2.transpose()
      
      print(df2, df2.dtypes, df2_transposed, df2_transposed.dtypes, sep='\n\n')
      

      输出:

          name  score  employed  kids
      0  Alice    9.5     False     0
      1    Bob    8.0      True     0
      
      #dtypes as expected
      name         object
      score       float64
      employed       bool
      kids          int64
      dtype: object
      
                    0     1
      name      Alice   Bob
      score       9.5     8
      employed  False  True
      kids          0     0
      
      #dtypes are now object
      0    object
      1    object
      dtype: object
      

      因此,如果您想要转换 dtypes,您必须包含其他命令。

      【讨论】:

      • y.apply(pd.to_numeric, errors='ignore') 似乎是迄今为止最接近的答案。虽然我一直在寻找一种直接的方式来从 ry 包括数字数据类型。
      • 您的解决方案都解决了 XY 问题。但真正的问题在于导入过程;)
      • 哈哈,你的解决方案很棒,但他们需要先假设数据已经被错误导入:p
      猜你喜欢
      • 2022-07-05
      • 2021-06-19
      • 2017-06-13
      • 2019-07-18
      • 2019-08-02
      • 1970-01-01
      • 2020-01-18
      • 2016-12-28
      相关资源
      最近更新 更多