簡體   English   中英

將字典字典轉換為具有數據類型的數據框

[英]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

ry進行這種轉換以便y.dtypes直接產生數據類型的首選方法是什么

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

類似於將r轉換為x

只需設置正確的方向(默認為columns ,您需要index )。

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

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

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()似乎不起作用,因為錯誤要么導致整個轉換失敗,要么如果被忽略,則返回原始數據類型)。


我剛剛看到.transpose()的文檔解決了這一點

當 DataFrame 具有混合 dtypes 時,我們會得到一個具有對象 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 ,則必須包含其他命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM