繁体   English   中英

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

[英]Converting dataframe into sub-list or dictionaries

我有表格格式的数据(行和列),我将其读入数据框(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中实现?

将df按“ Name分组后,可以使用字典理解

>>> 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}}
from collections import defaultdict
result = defaultdict(dict)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM