Получение значения из pandas df с определенной индексацией и фильтрацией - PullRequest
0 голосов
/ 10 января 2019

У меня есть следующий фрейм данных:

df
                                         eff   inv-cost  fix-cost  var-cost  inst-cap  cap-lo        cap-up  wacc  depreciation  annuity-factor
Site In Site Out Transmission Commodity                                                                                                        
Mid     North    hvac         Elec       0.9  1650000.0       0.0       0.0       0.0     0.0  1.500000e+15  0.07          40.0        0.075009
        South    hvac         Elec       0.9  1650000.0       0.0       0.0       0.0     0.0  1.500000e+15  0.07          40.0        0.075009
North   Mid      hvac         Elec       0.9  1650000.0       0.0       0.0       0.0     0.0  1.500000e+15  0.07          40.0        0.075009
        South    hvac         Elec       0.9  1650000.0       0.0       0.0       0.0     0.0  1.500000e+15  0.07          40.0        0.075009
South   Mid      hvac         Elec       0.9  1650000.0       0.0       0.0       0.0     0.0  1.500000e+15  0.07          40.0        0.075009
        North    hvac         Elec       0.9  1650000.0       0.0       0.0       0.0     0.0  1.500000e+15  0.07          40.0        0.075009

Я хотел бы получить значения в Site In и Site Out в виде списка, состоящего из кортежей. Ниже приведен пример списка, который я хотел бы иметь:

list = [('Mid','North'),
        ('South', 'Mid'),
        ('South', 'North')]

Ключевым моментом здесь является получение значений из Site In и Site Out с помощью функции панд, насколько это возможно, а также, поскольку передача от 'Mid' до 'South' равна передаче от 'South' к 'Mid', некоторые из созданных элементов списка должны быть отфильтрованы.

Следовало бы, что я думал до сих пор, но, может быть, вы могли бы найти лучший способ?

1) получить значения Site In и Site Out и создать список, список, вероятно, будет выглядеть так:

list = [('Mid','North'), ('Mid','South'),
        ('North', 'Mid'), ('North', 'South'),
        ('South', 'Mid'), ('South', 'North')]

2) поскольку половина элементов равна и не обязательна, например; ('Mid','North') & ('North', 'Mid'), один из них может быть удален.

3) В конце я хотел бы иметь одно из следующего (порядок не имеет значения):

list = [('Mid','North'), ('Mid','South'), ('North', 'South')]
list = [('North','Mid'), ('Mid','South'), ('North', 'South')]
list = [('South','Mid'), ('Mid','North'), ('North', 'South')]
etc...

Источник для df Лист передачи https://github.com/rl-institut/urbs-oemof/blob/dev/mimo.xlsx

PS: Я не знаю, какую функцию панд использовать для получения 1-го предмета, а также не знаю, как выталкивать элементы, упомянутые во 2-м предмете. И если у вас также есть лучший алгоритм для этого, я бы с удовольствием использовал его. TY

1 Ответ

0 голосов
/ 10 января 2019

Мне кажется, я понимаю, что вы ищете:

для шага 1: просто получите значения индекса:

# reset the index so that 'Site In' and 'Site Out' are left
lis = list(df.reset_index(level=[2,3]).index.values)

[('Mid', 'North'),
 ('Mid', 'South'),
 ('North', 'Mid'),
 ('North', 'South'),
 ('South', 'Mid'),
 ('South', 'North')]

затем используйте set с некоторым пониманием списка:

list(set(tuple(sorted(x)) for x in lis))

[('Mid', 'North'), ('Mid', 'South'), ('North', 'South')]

Я предполагаю, что ваш мультииндекс выглядит следующим образом:

MultiIndex(levels=[['Mid', 'North', 'South'], ['Mid', 'North', 'South'], ['hvac'], ['Elec']],
           labels=[[0, 0, 1, 1, 2, 2], [1, 2, 0, 2, 0, 1], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]],
           names=['Site In', 'Site Out', 'Transmission', 'Commodity'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...