Извлечь Pandas столбцы между двумя значениями - PullRequest
1 голос
/ 18 апреля 2020

У меня есть данные следующим образом. Первые 2 столбца являются строками и именами столбцов df [3:60] как последовательный год. Как я могу извлечь все столбцы с годами между 2005: 2010 и 2015 годами для всего

Country Indicator 1960    1961  1962    1963.....
Aruba    US$      15678 156789  156790  156791
Afgha    US$      68239 78239   88239   98239
Angola   US$      45678 55678   65678   75678
Albania  US$      89345 99345   109345  119345
Andorra  US$      62790 72790   82790   92790
Arab     US$     12987  22987   32987   42987
UAE      US$      6047  16047   26047   36047


Я попытался извлечь индекс столбцов

df.index.get_loc('2005') <- 45
df.index.get_loc('2010') <- 50
df.index.get_loc('2015') <- 55

df.iloc[:, [45:50,55:]]

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

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

Вы можете использовать np.r_:

a = df.columns.get_loc('2005')
b = df.columns.get_loc('2010')
c = df.columns.get_loc('2015')

df.iloc[:,np.r_[a-1:b,c-1:len(df.columns)]]

Пример:

df = pd.DataFrame(columns=list('ab') +
                [*map(str,pd.date_range('2000','2021',freq='y').year)])
print(df)

Empty DataFrame
Columns: [a, b, 2000, 2001, 2002, 2003, 2004, 2005,
         2006, 2007, 2008, 2009, 2010, 2011, 2012, 
         2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020]
Index: []

print(df.iloc[:,np.r_[a-1:b,c-1:len(df.columns)]])

Empty DataFrame
Columns: [2005, 2006, 2007, 2008, 2009, 2010, 2015, 2016, 2017, 2018, 2019, 2020]
Index: []
1 голос
/ 19 апреля 2020

Я думаю, что @ anky использует np.r_ - правильный путь к go и довольно гибкий, этот ответ является просто альтернативой, используя pandas встроенный метод индекса:

NB: я использую пример данных @ anky:

df = pd.DataFrame(columns=list('ab') +
                [*map(str,pd.date_range('2000','2021',freq='y').year)])

используйте slice_indexer , чтобы получить местоположения срезов заинтересованных значений:

A = df.columns.slice_indexer('2005','2010')
A
slice(7, 13, None)
#if one entry is included, it includes the location of the last index
B = df.columns.slice_indexer('2015')
B
slice(17, 23, None)

добавить ilo c индексирование как A, так и B:

res = df.iloc[:,A] + df.iloc[:,B]
res
Index(['2005', '2006', '2007', '2008', '2009', '2010', '2015', '2016', '2017',
       '2018', '2019', '2020'],
      dtype='object')

также обратите внимание, что метод @ anky будет более эффективным, поскольку ilo c вызывается только один раз. опять же, это просто игра с доступными методами

, конечно, вы можете комбинировать np.r_ с кусочками из A и B:

res = df.iloc[:,np.r_[A,B]]
res.columns
Index(['2005', '2006', '2007', '2008', '2009', '2010', '2015', '2016', '2017',
       '2018', '2019', '2020'],
      dtype='object')
...