熊猫数据框的几个字典列表

时间:2019-04-02 18:00:07

标签: python pandas dataframe dictionary

我正在从API中提取数据,并且它为我需要放入熊猫DataFrame中的每个条目返回字典列表。造成这种困难的原因是,被拉出的字典总是不同的。

3个示例:

[{'name': 'A', 'value': '1'},
 {'name': 'B', 'value': 'DateTimeValue'},
 {'name': 'C', 'value': '15'}]

[{'name': 'A', 'value': '2'},
 {'name': 'D', 'value': 'StringValue'},
 {'name': 'C', 'value': '15'}]

[{'name': 'A', 'value': '5'},
 {'name': 'B', 'value': 'DateTimeValue'},
 {'name': 'C', 'value': '19'},
 {'name': 'F', 'value': '25.123'}]

我需要“名称”值作为DF中的列,而“值”值作为行。在最终应用程序中,我将需要在for循环中一次拉出数百个。

我最接近的是在for循环中创建几个单行数据帧,然后尝试将它们合并。但是,合并只是使用_y和_x创建了新列。我需要数据框仅在出现新名称(例如上方的F)时创建新列。

这就是我尝试过的

df = pd.DataFrame(columns=['A']) # A is the only common column 

for dict in dict_list:

    data = getdata(API_stuff = ApiStuff, dicts = dict) #returns one list of dicts

    df1 = pd.DataFrame(dict) #get the data of one dict
    df1 = df1.transpose() 
    df1.reset_index(inplace=True) 
    df1 = df1.drop(columns= ['index'])
    df1.columns = df1.loc[0] # makes the column names the dict 'names'
    df1.drop(df1.index[0],inplace=True) # drop the duplicate row
    df1.index = ['Message-ID']
    # the above code creates a one row dataframe with the 'name' values as columns

    df = pd.merge(df, df1, on='A', how='outer') # merge one df on the previous ones

输出如下:

   A  B  C  A_x  D  C_x  A_y  B_x  C_y  F  
0  1  DT 15
1           2   SV  15
2                         5   DT    19  25.123

在空白处添加NaN

我需要输出为

   A    B    C    D     F   
0  1   DT   15   NaN   NaN
1  2   NaN  15   SV    NaN      
2  5   DT   19   NaN   25.123               

我知道有更好的方法可以做到这一点,但是我很难将各个部分放在一起。谢谢!

1 个答案:

答案 0 :(得分:2)

如果您以正确的形状提供pd.DataFrame构造函数,则可以处理此问题,例如:

In [8]: dict_list
Out[8]:
[[{'name': 'A', 'value': '1'},
  {'name': 'B', 'value': 'DateTimeValue'},
  {'name': 'C', 'value': '15'}],
 [{'name': 'A', 'value': '2'},
  {'name': 'D', 'value': 'StringValue'},
  {'name': 'C', 'value': '15'}],
 [{'name': 'A', 'value': '5'},
  {'name': 'B', 'value': 'DateTimeValue'},
  {'name': 'C', 'value': '19'},
  {'name': 'F', 'value': '25.123'}]]

In [9]: pd.DataFrame([{d['name']:d['value'] for d in ds} for ds in dict_list])
Out[9]:
   A              B   C            D       F
0  1  DateTimeValue  15          NaN     NaN
1  2            NaN  15  StringValue     NaN
2  5  DateTimeValue  19          NaN  25.123