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