从嵌套字典创建一个 Tall 格式的数据框 [重复]
Posted
技术标签:
【中文标题】从嵌套字典创建一个 Tall 格式的数据框 [重复]【英文标题】:Create a Tall formatted Dataframe from nested dictionaries [duplicate] 【发布时间】:2019-08-04 17:15:30 【问题描述】:您好,我有一本字典,如图所示(复制示例)。我想把它转换成一个高大的DataFrame
。
字典示例:
'Jill': 'Avenger: Age of Ultron': 7.0,
'Django Unchained': 6.5,
'Gone Girl': 9.0,
'Kill the Messenger': 8.0,
'Toby': 'Avenger: Age of Ultron': 8.5,
'Django Unchained': 9.0,
'Zoolander': 2.0
预期的高数据框如下所示:
Column1 Column2 Column3
Jill Avenger: Age of Ultron 7.0
Jill Django Unchained 6.5
Jill Gone Girl 9.0
Jill Kill the Messenger 8.0
Toby Avenger: Age of Ultron 8.5
Toby Django Unchained 9.0
Toby Zoolander 2.0
我尝试了以下方法,它将字典的主键作为第一列,但无法使其成为高数据框:
pd.DataFrame.from_dict(d, orient='index')
【问题讨论】:
你可以使用一个简单的字典理解来解析这个从 concat 语句开始pd.concat(k: pd.DataFrame(v).T for k, v in yourDict.items(), axis=0)
【参考方案1】:
d = 'Jill': 'Avenger: Age of Ultron': 7.0,
'Django Unchained': 6.5,
'Gone Girl': 9.0,
'Kill the Messenger': 8.0,
'Toby': 'Avenger: Age of Ultron': 8.5,
'Django Unchained': 9.0,
'Zoolander': 2.0
df = pd.DataFrame.from_dict(d).reset_index()
df = pd.melt(df, id_vars=["index"],
var_name="By", value_name="Score").dropna()
【讨论】:
【参考方案2】:一种相当简单的方法是将字典转换为列表列表并将其提供给数据框:
data = [[x, y, z] for x,v in d.items() for y, z in v.items()]
df = pd.DataFrame(data, columns=['Column' + str(i) for i in range(1,4)])
它给出:
Column1 Column2 Column3
0 Jill Avenger: Age of Ultron 7.0
1 Jill Django Unchained 6.5
2 Jill Gone Girl 9.0
3 Jill Kill the Messenger 8.0
4 Toby Avenger: Age of Ultron 8.5
5 Toby Django Unchained 9.0
6 Toby Zoolander 2.0
【讨论】:
【参考方案3】:ratings = 'Jill': 'Avenger: Age of Ultron': 7.0,
'Django Unchained': 6.5,
'Gone Girl': 9.0,
'Kill the Messenger': 8.0,
'Toby': 'Avenger: Age of Ultron': 8.5,
'Django Unchained': 9.0,
'Zoolander': 2.0
values = [[name, movie, rating] for name, r in ratings.items() for movie, rating in r.items()]
df = pd.dataframe(values)
【讨论】:
【参考方案4】:只需传递给DataFrame
,其余的我们在pandas
中处理
pd.DataFrame(ratings).reset_index().melt('index').dropna()
Out[118]:
index variable value
0 Avenger: Age of Ultron Jill 7.0
1 Django Unchained Jill 6.5
2 Gone Girl Jill 9.0
3 Kill the Messenger Jill 8.0
5 Avenger: Age of Ultron Toby 8.5
6 Django Unchained Toby 9.0
9 Zoolander Toby 2.0
【讨论】:
【参考方案5】:另一种方法,按原样在dict
上使用pandas.DataFrame
构造函数,然后使用stacking、renaming 并对axis 和columns 进行排序:
df = (pd.DataFrame(d)
.stack()
.reset_index()
.rename('level_0': 'Column2', 'level_1': 'Column1', 0: 'Column3', axis=1)
.sort_index(1).sort_values('Column1'))
print(df)
Column1 Column2 Column3
0 Jill Avenger: Age of Ultron 7.0
2 Jill Django Unchained 6.5
4 Jill Gone Girl 9.0
5 Jill Kill the Messenger 8.0
1 Toby Avenger: Age of Ultron 8.5
3 Toby Django Unchained 9.0
6 Toby Zoolander 2.0
【讨论】:
以上是关于从嵌套字典创建一个 Tall 格式的数据框 [重复]的主要内容,如果未能解决你的问题,请参考以下文章