将字典的字典转换为具有数据类型的数据框
Convert dictionary of dictionaries to dataframe with data types
将字典的字典转换为具有数据类型的数据框的首选方法是什么?
我有以下类型的字典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
从 r
到 y
进行这种转换的首选方法是什么,以便 y.dtypes
直接产生数据类型
a float64
b float64
c object
d float64
e float64
dtype: object
类似于将r
转换为x
?
在 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_numeric
与某种循环或 apply
一起使用,如 :
>>> 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()
似乎不起作用,因为错误要么导致整个转换失败,要么如果被忽略,return原始数据类型)。
我刚看到 .transpose()
addresses this point:
的文档
When the DataFrame has mixed dtypes, we get a transposed DataFrame with the object dtype:
转置一个 mixed-type DataFrame return 一个 object-type 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
被转换,您 必须 添加额外的命令。
只需设置正确的方向(默认为 columns
,您需要 index
)。
df = pd.DataFrame.from_dict(r, orient='index')
a float64
b float64
c object
d float64
e float64
dtype: object
将字典的字典转换为具有数据类型的数据框的首选方法是什么?
我有以下类型的字典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
从 r
到 y
进行这种转换的首选方法是什么,以便 y.dtypes
直接产生数据类型
a float64
b float64
c object
d float64
e float64
dtype: object
类似于将r
转换为x
?
在 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_numeric
与某种循环或 apply
一起使用,如
>>> 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()
似乎不起作用,因为错误要么导致整个转换失败,要么如果被忽略,return原始数据类型)。
我刚看到 .transpose()
addresses this point:
When the DataFrame has mixed dtypes, we get a transposed DataFrame with the object dtype:
转置一个 mixed-type DataFrame return 一个 object-type 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
被转换,您 必须 添加额外的命令。
只需设置正确的方向(默认为 columns
,您需要 index
)。
df = pd.DataFrame.from_dict(r, orient='index')
a float64
b float64
c object
d float64
e float64
dtype: object