pandas: доступ к значениям i столбца, соответствующим значению i индекса в другом df

#python #pandas

#python #pandas

Вопрос:

Я пытаюсь получить доступ к значениям столбцов в одном фрейме данных, скажем new_df , соответствующим индексу i в другом df (скажем, df1)

new_df выглядит примерно так:

 Id          100120  100142  118365  269946  621382
2018-12-31       0       0       0       0       0
2019-01-31       0      40       0       0       0
2019-02-28      16      48       0       0       0
 

и df1:

 0  100121        high  not_seasonal      trending
1  100140        high  not_seasonal      trending
2  118360        high      seasonal  not_trending
 

Я знаю, что это можно легко сделать следующим образом:

 for i in df1.index:
    new_df.iloc[:,i].values
 

который возвращает массив, подобный выводу всех столбцов, содержащихся в i столбце
примера new_df для столбца 1

 gogo [  0  40  48  ]
 

Однако проблема заключается в доступе к столбцу i нового df в функции, где i передается в качестве параметра
пример:

 def timeseriesCVscore(i):
    errors = []
    values = df1.loc[new_df.iloc[:,i]].values 
    .....
 

и

 def timeseriesCVscore(i):
   
    errors = []
    
    for i in seasonal_profile_df.index:
        values = new_df.iloc[:,i].values
 

оба выдают одну и ту же ошибку:

 KeyError: "Passing list-likes to .loc or [] with any missing labels is no longer supported. The following labels were missing: Int64Index([40, 48], dtype='int64')
 

Моя структура кода следующая, чтобы автоматически перебирать i в new_df

 for in df1:
    return timeseriesCVscore(i)
 

и получите вывод массива, содержащего все значения i столбца.

Я не могу найти способ обойти внутри функции, любая помощь будет признательна

ОБНОВЛЕНИЕ: проверка внутри функции

     for f in seasonal_profile_df.index:
        values = np.where((seasonal_profile_df.index[f] == i), new_df.loc[:,i].values, 0)
 

выдает следующую ошибку:

 KeyError: "None of [Int64Index([0, 0, 16], dtype='int64', name='Id')] are in the [columns]"

 

Ответ №1:

Что касается вашего кода:

 def timeseriesCVscore(i):
    errors = []
    values = df1.loc[new_df.iloc[:,i]].values 
 

в случае i = 1 результаты «new_df.iloc[:,1]» являются:

 Id
2018-12-31     0
2019-01-31    40
2019-02-28    48
Name: 100142, dtype: int64
 

итак, 0, 40 и 48 использовались в качестве меток для df1, как если бы:

 df1.loc([0,40,48])
 

Но в df1 нет ни метки 40, ни 48, как вы найдете в конце сообщения об ошибке

 The following labels were missing: Int64Index([40, 48], dtype='int64')
 

Комментарии:

1. Привет, Нур! да, я понимаю, поэтому, как я могу получить доступ к этому массиву данных из индекса

2. вы можете получить к ним доступ с помощью своего кода без изменений, если df1 имеет метки at 40, 48 строк, если df1 имеет 49 строк