Фильтрация панд df со значениями уровня - PullRequest
0 голосов
/ 09 января 2019

У меня есть следующие панды df:

df
                        price           max    maxperhour
Site  Commodity Type                        
Mid   Biomass   Stock     6.0  1.500000e+15  1.500000e+15
      CO2       Env       0.0  1.500000e+15  1.500000e+15
      Coal      Stock     7.0  1.500000e+15  1.500000e+15
      Elec      Demand    NaN           NaN           NaN
      Gas       Stock    27.0  1.500000e+15  1.500000e+15
      Hydro     SupIm     NaN           NaN           NaN
      Lignite   Stock     4.0  1.500000e+15  1.500000e+15
      Solar     SupIm     NaN           NaN           NaN
      Wind      SupIm     NaN           NaN           NaN

Я бы хотел отфильтровать вышеупомянутый df и создать список из Commodity элементов в виде списка, когда Site == 'Mid' и Type == ('Stock' or 'Demand').

поэтому следующий список должен быть создан с некоторой функцией фильтрации панд:

df.somefunction()
['Biomass', 'Coal', 'Gas', 'Lignite', 'Elec']

Как бы мне этого добиться?


Наконец, если это возможно, я бы хотел, чтобы последним элементом был 'Elec', что я имею в виду; когда список создан, 'Elec' будет, вероятно, третьим элементом списка, например:

['Biomass', 'Coal', 'Elec', 'Gas', 'Lignite']

Однако было бы лучше, если бы я мог получить 'Elec' в качестве последнего элемента, например:

['Biomass', 'Coal', 'Gas', 'Lignite', 'Elec']

, так как это единственный элемент с Type == 'Demand'


От @ Jezrael

df[(df.index.get_level_values('Site') == 'Mid') & (df.index.get_level_values('Type') == 'Stock')].index.remove_unused_levels().get_level_values('Commodity').tolist()

1 Ответ

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

Решение с MultiIndex:

m1 = (df.index.get_level_values('Site') == 'Mid')
m2 = (df.index.get_level_values('Type') == 'Stock')
m3 = (df.index.get_level_values('Type') == 'Demand')

idx1 = df[m1 & m2].index.remove_unused_levels().get_level_values('Commodity')
idx2 = df[m1 & m3].index.remove_unused_levels().get_level_values('Commodity')

idx = idx1.append(idx2)
print (idx)
Index(['Biomass', 'Coal', 'Gas', 'Lignite', 'Elec'], dtype='object', name='Commodity')

Альтернатива с колонками:

df1 = df.reset_index()
m1 = (df1['Site'] == 'Mid')
m2 = (df1['Type'] == 'Stock')
m3 = (df1['Type'] == 'Demand')

idx1 = df1.loc[m1 & m2, 'Commodity']
idx2 = df1.loc[m1 & m3, 'Commodity']

idx = idx1.append(idx2).tolist()
print (idx)
['Biomass', 'Coal', 'Gas', 'Lignite', 'Elec']
...