найти первое вхождение значения (из списка значений) в фрейме данных pandas и вернуть индекс строки

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть фрейм данных pandas (фактический набор данных намного больше и содержит числа от 1 до 50):

           date           main   N1  N2  N3  N4  N5
0   2020-09-18  7-12-14-40-42   7   12  14  40  42
1   2020-09-11  2-5-24-43-45    2   5   24  43  45
2   2020-09-04  5-23-28-38-49   5   23  28  38  49
3   2020-08-28  8-11-22-38-41   8   11  22  38  41
4   2020-08-21  26-27-30-46-49  26  27  30  46  49
  

Я хочу вернуть индекс строки для первого вхождения каждого числа. До сих пор единственный способ, которым я смог добиться этого, — это «вручную» с помощью

 lotteryData.loc[(lotteryData.N5==1)].head(49)
  

который в этом примере дает номер индекса строки 2. Это, очевидно, очень неуклюже и вообще не использует возможности фрейма данных Pandas. Есть ли способ перебора списка в формате 5-23-28-38-49 напрямую для сбора этой информации или способ перебора столбцов, чтобы найти первое вхождение всех чисел от 1 до 50

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

1. Можете ли вы показать ожидаемый результат?

2. В идеале я хочу новый фрейм данных с номером и индексом строки в качестве значения, например, 49 и 2 в приведенном выше примере (индекс в этом наборе данных фактически отражает недели). приведенный выше пример с использованием loc выводит строку с индексом

3. Для каждого столбца; сгруппируйте по Series(np.arrange(1,51)) , получите индекс первого элемента в каждой группе. Вам нужно первое вхождение числа в любом из столбцов или первое вхождение в каждом столбце?

4. индекс первого вхождения числа в любом из столбцов

Ответ №1:

Мы можем выполнить stack drop_duplicates

 out = df.loc[:,'N2':].stack().drop_duplicates()
0  N2    12
   N3    14
   N4    40
   N5    42
1  N2     5
   N3    24
   N4    43
   N5    45
2  N2    23
   N3    28
   N4    38
   N5    49
3  N2    11
   N3    22
   N5    41
4  N2    27
   N3    30
   N4    46
dtype: int64
  

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

1. Спасибо. Теперь это отлично сработало, чтобы перевести его в формат, который я хотел бы. Мне нужно будет прочитать функциональность stack() и drop_duplicates(), чтобы понять это правильно. Могу ли я спросить, как получить число и индекс в новый фрейм данных? Хотя вывод понятен, я не уверен, как использовать его в фрейме данных