Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按字典对系列或数据帧进行分组_Python_Pandas_Dataframe - Fatal编程技术网

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

很抱歉回复太晚,我的笔记本电脑上周被偷了,所以我现在就回去检查一下。