Python 如何将字典作为行添加到数据帧?

Python 如何将字典作为行添加到数据帧?,python,pandas,dictionary,dataframe,Python,Pandas,Dictionary,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.Dat

我有一个带有以下列的
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循环的结果,它们应作为唯一行添加。

您可以循环字典,将每个字典的结果附加到列表中,然后将列表作为行添加到数据帧中

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)

使用dict的pandas.DataFrame.from替代构造函数。将“行”构建到列表中,首先:

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'})
然后,只需确保传递适当的“orient”参数:

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

我认为没有必要进行所有的预处理。
DataFrame
construtors处理一系列的
dict
s很好。我不知道
pandas.DataFrame。从dict
,这很酷。这就是该函数有效地实现的功能,尽管据推测,
DataFrame.from_dict
可以更有效地实现它。正如我刚刚发现的,普通的
pd.DataFrame
构造函数也可以很好地工作。它并没有像我需要的那样工作,例如每个dict都是4个dict的组合:
z={**adresa,**d,**pret,**autor}
当我将nw
z
添加到现有列表
行中时,它会重写最后一个dict。列的数量及其名称应该一直保持不变,但它们在变化。@Sinchetru我不知道在列表中添加新的
z
将如何重写最后一个
dict
。这绝对不应该发生。你到底在干什么?我发现了错误。我在循环中编写了
行=[]
,因此每次它都创建了一个新列表。你的答案是正确的。我将表达式更改为
df=pd.DataFrame(rows,columns=columns)
,列名称和编号就是我需要的。