2017-03-06 650 views
2

我有一個DataFrame具有下列:如何將字典作爲一行添加到DataFrame?

columns = ['Autor', 'Preţul', 'Suprafaţa totală', 'Etaj', 'Etaje', 'Tipul casei', 'Tipul de camere','Numărul de camere','Starea apartamentului', 'Planificare', 'Tipul clădirii', 'Sectorul', 'Strada', 'Numărul casei'] 
df = pd.DataFrame(columns=columns) 

我想行添加到這個DataFrame一些字典行,例如第一行我想廣告的這本字典:

{'Autor': nan, 
'Balcon/lojă': '2', 
'Etaj': '1', 
'Grup sanitar': 'separat', 
'Locul de amplasare în casă': 'In mijlocul casei', 
'Numărul casei': nan, 
'Numărul de camere': '4 şi mai multe camere', 
'Parcare': 'deschisă', 
'Preţul': nan, 
'Sectorul': nan, 
'Strada': nan, 
'Suprafaţa totală': '90 m²', 
'Tipul clădirii': 'Dat în exploatare'} 

字典中不在DataFrame列中的鍵的值應設置爲NaN的值。字典只有一部分列名作爲鍵。

例如第二字典:

{'Autor': nan, 
'Numărul casei': nan, 
'Numărul de camere': '3 camere', 
'Preţul': nan, 
'Sectorul': nan, 
'Strada': nan, 
'Suprafaţa totală': '103 m²', 
'Tipul clădirii': 'Dat în exploatare'} 

詞典都在for循環的結果,他們應該作爲唯一的行。

回答

4

使用pandas.DataFrame.from_dict替代構造函數。建立你的 「行」 到一個列表開始說起:

In [22]: import numpy as np 

In [23]: nan = np.nan 

In [24]: rows = [] 

In [25]: rows.append({'Autor': nan, 
    ...: 'Balcon/lojă': '2', 
    ...: 'Etaj': '1', 
    ...: 'Grup sanitar': 'separat', 
    ...: 'Locul de amplasare în casă': 'In mijlocul casei', 
    ...: 'Numărul casei': nan, 
    ...: 'Numărul de camere': '4 şi mai multe camere', 
    ...: 'Parcare': 'deschisă', 
    ...: 'Preţul': nan, 
    ...: 'Sectorul': nan, 
    ...: 'Strada': nan, 
    ...: 'Suprafaţa totală': '90 m²', 
    ...: 'Tipul clădirii': 'Dat în exploatare'}) 

In [26]: rows.append({'Autor': nan, 
    ...: 'Numărul casei': nan, 
    ...: 'Numărul de camere': '3 camere', 
    ...: 'Preţul': nan, 
    ...: 'Sectorul': nan, 
    ...: 'Strada': nan, 
    ...: 'Suprafaţa totală': '103 m²', 
    ...: 'Tipul clădirii': 'Dat în exploatare'}) 

然後,只需確保通過適當的 「東方」 的說法:

In [28]: pd.DataFrame.from_dict(rows, orient='columns') 
Out[28]: 
    Autor Balcon/lojă Etaj Grup sanitar Locul de amplasare în casă \ 
0 NaN   2 1  separat   In mijlocul casei 
1 NaN   NaN NaN   NaN      NaN 

    Numărul casei  Numărul de camere Parcare Preţul Sectorul Strada \ 
0   NaN 4 şi mai multe camere deschisă  NaN  NaN  NaN 
1   NaN    3 camere  NaN  NaN  NaN  NaN 

    Suprafaţa totală  Tipul clădirii 
0   90 m² Dat în exploatare 
1   103 m² Dat în exploatare 

編輯

其實,剛注意到正常的構造函數工作正常,並且不需要任何參數!

In [31]: pd.DataFrame(rows) 
Out[31]: 
    Autor Balcon/lojă Etaj Grup sanitar Locul de amplasare în casă \ 
0 NaN   2 1  separat   In mijlocul casei 
1 NaN   NaN NaN   NaN      NaN 

    Numărul casei  Numărul de camere Parcare Preţul Sectorul Strada \ 
0   NaN 4 şi mai multe camere deschisă  NaN  NaN  NaN 
1   NaN    3 camere  NaN  NaN  NaN  NaN 

    Suprafaţa totală  Tipul clădirii 
0   90 m² Dat în exploatare 
1   103 m² Dat în exploatare 
+0

它不會工作,因爲我需要,例如每個字典是4個字母的組合:'z = {** adresa,** d,** pret,** autor}'當我添加一個新字符'z'時現有的「行」列表重寫了最後一個字典。列和他們的名字的數量應始終保持不變,但它們正在改變。 – Sinchetru

+0

@Sinchetru我不明白爲什麼那會很重要...... –

+0

@Schechetru我不明白如何在列表中添加新的'z'會重寫最後一個'dict'。這絕對不應該發生。你到底在做什麼? –

1

您可以遍歷字典,將每個字典的結果追加到列表中,然後將該列表添加爲DataFrame中的一行。

dflist = [] 
for dic in dictionarylist: 
    rlist = [] 
    for key in keylist: 
     if dic[key] is None: 
      rlist.append(None) 
     else: 
      rlist.append(dic[key]) 

    dflist.append(rlist) 

df = pd.DataFrame(dflist) 
+0

我不認爲有任何需要所有的預處理。 'DataFrame'的constructors處理'dict'的列表就好了。 –

+0

我不知道'pandas.DataFrame.from_dict',這很酷。這就是該函數有效的功能,儘管大概是'DataFrame.from_dict'更有效。 – Michael

+0

好吧,就像我剛剛發現的那樣,普通的'pd.DataFrame'構造函數也可以很好地工作。 –