Python 按字典对系列或数据帧进行分组
对不起,如果以前有人问过这个问题,我做了一个快速搜索,没有看到任何东西 我有一个数据帧:Python 按字典对系列或数据帧进行分组,python,pandas,dataframe,Python,Pandas,Dataframe,对不起,如果以前有人问过这个问题,我做了一个快速搜索,没有看到任何东西 我有一个数据帧: Density 1212e 0.076014 1212f 0.210480 1212g 0.175493 1212h 0.176658 1212i 0.163813 1212l 0.138801 1212m 0.125144 1212o 0.118789 1212p 0.167668 1212q 0.106552 321aa 0.173623 32
Density
1212e 0.076014
1212f 0.210480
1212g 0.175493
1212h 0.176658
1212i 0.163813
1212l 0.138801
1212m 0.125144
1212o 0.118789
1212p 0.167668
1212q 0.106552
321aa 0.173623
321dd 0.215807
321ee 0.184621
321l 0.177182
321m 0.162529
321n 0.208383
321o 0.207479
321q 0.200622
321y 0.088065
321z 0.150651
还有一本字典:
animals = {'5992' :('1212e', '1212f', '1212g', '1212h', '1212i'),
'6894' : ('321l', '321m', '321n', '321o', '321p', '321q'),
'5866' : ('1212l', '1212m', '1212n', '1212o', '1212p', '1212q'),
'6137' : ("321aa", '321dd', '321ee', '321y', '321z') }
我的最终目标是创建一个多层索引,该索引使用来自动物的键作为顶层,使用来自数据帧的事件作为第二层
比如:
Density
5992 1212e 0.076014
1212f 0.210480
1212g 0.175493
1212h 0.176658
1212i 0.163813
有没有一个好的python方法可以做到这一点,我在考虑创建一个新列,将它设置为索引,然后将新列设置为更高的索引。然而,这似乎有点迂回,我宁愿学习如何编写更干净的代码,有什么建议吗
谢谢 使用连接和多索引的方法:
dict = {'Density': {'1212e': 0.076014,'1212f': 0.210480,
'1212g': 0.175493,'1212h': 0.176658,'1212i': 0.163813,'1212l': 0.138801,'1212m': 0.125144,'1212o': 0.118789,'1212p': 0.167668,
'1212q': 0.106552,'321aa': 0.173623,'321dd': 0.215807,
'321ee': 0.184621,'321l': 0.177182,'321m': 0.162529,'321n': 0.208383,
'321o': 0.207479,'321q': 0.200622,'321y': 0.088065,'321z': 0.150651}}
df1 = pd.DataFrame(dict)
df1.index.name = 'id'
animals = {'5992' :('1212e', '1212f', '1212g', '1212h', '1212i'),
'6894' : ('321l', '321m', '321n', '321o', '321p', '321q'),
'5866' : ('1212l', '1212m', '1212n', '1212o', '1212p', '1212q'),
'6137' : ("321aa", '321dd', '321ee', '321y', '321z') }
l = []
for k,v in animals.iteritems():
l.extend (pd.MultiIndex.from_product([[k],v]))
idx = pd.MultiIndex.from_tuples(l)
idx.names = ['key','id']
df2 = pd.DataFrame(index = idx)
df2.join(df1)
Density
key id
5866 1212l 0.138801
1212m 0.125144
1212n NaN
1212o 0.118789
1212p 0.167668
1212q 0.106552
6894 321l 0.177182
321m 0.162529
321n 0.208383
321o 0.207479
321p NaN
321q 0.200622
6137 321aa 0.173623
321dd 0.215807
321ee 0.184621
321y 0.088065
321z 0.150651
5992 1212e 0.076014
1212f 0.210480
1212g 0.175493
1212h 0.176658
1212i 0.163813
你可以重写你的
animals
dict并使用df.map
inv_animals = {i: int(k) for k, v in animals.items() for i in v}
这将为您提供从代码
到动物
编号的映射
{'1212e': 5992,
'1212f': 5992,
'1212g': 5992,
'1212h': 5992,
'1212i': 5992,
'321l': 6894,
'321m': 6894,
'321n': 6894,
'321o': 6894,
'321p': 6894,
'321q': 6894,
'1212l': 5866,
'1212m': 5866,
'1212n': 5866,
'1212o': 5866,
'1212p': 5866,
'1212q': 5866,
'321aa': 6137,
'321dd': 6137,
'321ee': 6137,
'321y': 6137,
'321z': 6137}
然后简单地使用df.map
并设置索引
df['animal'] = df.code.map(inv_animals)
df.set_index(['animal', 'code'])
density
animal code
5992 1212e 0.076014
1212f 0.210480
1212g 0.175493
1212h 0.176658
1212i 0.163813
5866 1212l 0.138801
1212m 0.125144
1212o 0.118789
1212p 0.167668
1212q 0.106552
6137 321aa 0.173623
321dd 0.215807
321ee 0.184621
6894 321l 0.177182
321m 0.162529
321n 0.208383
321o 0.207479
321q 0.200622
6137 321y 0.088065
321z 0.150651
很抱歉回复太晚,我的笔记本电脑上周被偷了,所以我现在就回去检查一下。