将数据帧转换为子列表或字典

2024-06-15 00:33:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我将表格格式的数据(行和列)读入数据帧(Data1):

     Name         D    Score
0   Angelica     D1     3.5
1   Angelica     D2     2.0
2   Bill         D1     2.0
3   Chan         D3     1.0 
......

我可以使用以下方法将其转换为列表:

Data2 = Data1.values.tolist()

并得到以下输出:

[
['Angelica', 'D1', 3.5], ['Angelica', 'D2', 2.0],
['Bill', 'D1', 2.0], ['Bill', 'D2', 3.5],
['Chan', 'D8', 1.0], ['Chan', 'D3', 3.0], ['Chan', 'D4', 5.0],
['Dan', 'D4', 3.0], ['Dan', 'D5', 4.5], ['Dan', 'D6', 4.0]
]

我想要的是,输出如下:

{
'Angelica': {'D1': 3.5, 'D2': 2.0} ,
'Bill': {'D1': 2.0, 'D2': 3.5} 
'Chan': {'D8': 1.0, 'D3': 3.0, 'D4': 5.0 } 
'Dan': {'D4': 3.0, 'D5': 4.5, 'D6': 4.0} 
}

如何在Python中实现这一点?你知道吗


Tags: 数据格式表格chand2d1d3dan
3条回答
from collections import defaultdict
result = defaultdict(dict)

for item in Data2:
    result[item[0]].update(dict([item[1:]]))

您可以在通过Name列对df进行分组之后使用字典理解

>>> df = pd.DataFrame([{'Name': 'Angela', 'Score': 3.5, 'D': 'D1'}, {'Name': 'Angela', 'Score': 2.0, 'D': 'D2'}, {'Name': 'Bill', 'Score': 2.0, 'D': 'D1'}, {'Name': 'Chan', 'Score': 1.0, 'D': 'D3'}])
>>> df
    D    Name  Score
0  D1  Angela    3.5
1  D2  Angela    2.0
2  D1    Bill    2.0
3  D3    Chan    1.0
>>> data2 = {name: {df.ix[v].D: df.ix[v].Score for v in val} for name, val in df.groupby('Name').groups.items()}
>>> data2
{'Chan': {'D3': 1.0}, 'Angela': {'D1': 3.5, 'D2': 2.0}, 'Bill': {'D1': 2.0}}

按名称分组后,可以压缩每个组的值:

In [4]: l = [
   ...: ['Angelica', 'D1', 3.5], ['Angelica', 'D2', 2.0],
   ...: ['Bill', 'D1', 2.0], ['Bill', 'D2', 3.5],
   ...: ['Chan', 'D8', 1.0], ['Chan', 'D3', 3.0], ['Chan', 'D4', 5.0],
   ...: ['Dan', 'D4', 3.0], ['Dan', 'D5', 4.5], ['Dan', 'D6', 4.0]
   ...: ]
   ...: columns=["Name", "D", "Score"]
   ...: df = pd.DataFrame(l, columns=columns)
   ...: 

In [5]: {name: dict(zip(v["D"], v["Score"])) for name, v in df.groupby("Name")}


In [6]: data
Out[6]: 
{'Angelica': {'D1': 3.5, 'D2': 2.0},
 'Bill': {'D1': 2.0, 'D2': 3.5},
 'Chan': {'D3': 3.0, 'D4': 5.0, 'D8': 1.0},
 'Dan': {'D4': 3.0, 'D5': 4.5, 'D6': 4.0}}

相关问题 更多 >