按字典分组大熊猫系列或数据

时间:2018-06-28 23:17:07

标签: 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
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

是否有一个很好的pythonic方法,我正在考虑创建一个新列,将其设置为关闭索引,然后将该新列设置为更高的索引。但是,这似乎有些round回,我宁愿学习如何编写一些更简洁的代码,有什么建议吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以重写animals字典并使用df.map

inv_animals = {i: int(k) for k, v in animals.items() for i in v}

这为您提供了一个从codeanimal数字的映射

{'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

答案 1 :(得分:0)

设置

df = pd.read_table(io.StringIO("""       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"""), delim_whitespace=True)

df = df.reset_index()
df.columns = ["code", "density"]

然后简单

df["g"] = None
for k,v in nimals.items():
    df.loc[df.code.isin(v), "g"] = k
df.set_index(["g", "code"])

                density
g       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.15065

答案 2 :(得分:0)

使用带有多索引联接的方法:

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