通过特定的索引和过滤从pandas df获取值

时间:2019-01-10 15:49:39

标签: python pandas list indexing filter

我有以下数据框:

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 InSite Out中的值,因为它们是一个由元组组成的列表。下面是我想要的列表示例:

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

这里的重点是要通过熊猫函数尽可能容易地从Site InSite Out获取值,并且因为从'Mid''South'的传输是相等的从'South''Mid'的传输,应该过滤列表中某些已创建的元素。

以下是我到目前为止的想法,但也许您可以找到更好的方法?

1)获取Site InSite 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: 我不知道要使用哪一个熊猫函数来获得第一项,也不知道如何弹出第二项中提到的元素。如果您也有一个更好的算法,我会很乐意使用它。 TY

1 个答案:

答案 0 :(得分:0)

我想我了解您在寻找什么:

对于步骤1:只需获取索引值:

Const.commThread.start()

然后将# 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')]