группа панды серии или фрейма данных по словарю - PullRequest
0 голосов
/ 29 июня 2018

Извините, если раньше об этом спрашивали, я сделал быстрый поиск и ничего не увидел.

У меня есть датафрейм:

        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

Есть ли хороший питонический способ сделать это, я подумывал о создании нового столбца, установке его индекса, а затем установке этого нового столбца на более высокий индекс. Однако это кажется немного окольным, и я предпочел бы научиться писать более понятный код, какие-либо предложения?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

подход, использующий соединение с мультииндексом:

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
0 голосов
/ 29 июня 2018

Вы можете переписать свой animals дикт и использовать df.map

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

Это дает вам отображение от вашего code до animal числа

{'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
0 голосов
/ 29 июня 2018

Настройка

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...