Функция последовательности R в Python

#python #pandas

#python #pandas

Вопрос:

версия pandas: 1.2

Я пытаюсь взять столбец pandas фрейма данных python pandas и создать логику того же типа, что и в R, которая была бы

 ss=sequence(df$los)
  

Которая создает для первых двух записей

 [1]  1  2  3  4  5  1  2  3  4  5 
  

Пример фрейма данных:

 df = pd.DataFrame([('test', 5), ('t2', 5), ('t3', 2), ('t4', 6)],
                  columns=['first', 'los'])
df

  first  los
0  test    5
1    t2    5
2    t3    2
3    t4    6
  

Таким образом, первая строка упорядочена 1-5, вторая строка упорядочена 1-5, а третья строка упорядочена 1-2 и т.д. В R это становится одним упорядоченным списком. Я бы хотел, чтобы это был python.

Что я смог сделать, так это.

 ss = df['los']
ss.apply(lambda x: np.array(range(1, x)))
18                          [1, 2, 3, 4, 5]
90                          [1, 2, 3, 4, 5]
105                                   [1,2]
106                      [1, 2, 3, 4, 5, 6]
  

Это близко, но тогда мне нужно объединить его в один pd.Series, чтобы он был:

 [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 1, 2, 3, 4, 5, 6]
  

Ответ №1:

Использовать explode() :

 df.los.apply(lambda x: np.arange(1, x 1)).explode().tolist()
  

Вывод:

 [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 1, 2, 3, 4, 5, 6]
  

Примечание — вы можете пропустить ss шаг назначения и использовать np.arange для некоторой оптимизации.

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

1. Не уверен, почему, но это не дает мне правильного массива sequenca, в нем есть дополнительные числа. Мой фактический набор данных, который был повторен тем же номером ‘los’, содержит 1363 записи. ответ Куанг Хоанг произвел 1363 записи. Этот ответ выдает 1393. использование только ss2 = dis.los.explode().tolist() 1363

2. Интересно. Получаете ли вы правильную последовательность при запуске с предоставленными вами тестовыми данными?

3. Обновление: это ПРАВИЛЬНЫЙ ответ, ответ Куанга не предоставил правильную последовательность, но это имитирует функцию последовательности R.

Ответ №2:

Вы можете просто использовать concatenate :

 np.concatenate([np.arange(x) 1 for x in df['los']])
  

Вывод:

 array([1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 1, 2, 3, 4, 5, 6])