我正在从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
我知道有更好的方法可以做到这一点,但是我很难将各个部分放在一起。谢谢!
答案 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