Панды: Сделайте x-ю следующую строку столбцом

#python #pandas #shift

#python #pandas #сдвиг

Вопрос:

У нас есть следующий фрейм данных:

 df = pd.DataFrame({'name': ['John', 'Max', 'Ethan', 'Karen', 'Carl', 'Jenny']})
 

df:

    name
0  John
1  Max
2  Ethan
3  Caren
4  Carl
5  Jenny
6  Claudia
   ...
 

Для каждой строки мне нравится:

  • Добавьте содержимое n-й строки в новый столбец
  • Запишите в n-ю строку содержимое верхнего

С переходом 0: (следующая строка)

    name   name_2  
0  John   Max
1  Max    John     
2  Ethan  Caren
3  Caren  Ethan
4  Carl   Jenny
5  Jenny  Carl
6  Claudia Whoever
   ...
 

С переходом на 1 (следующая строка 1):

    name    name_2
0  John    Ethan
1  Max     Caren
2  Ethan   John
3  Caren   Max
4  Carl    Claudia
5  Jenny   Whoever
6  Claudia Carl
...
 

Есть идеи, как решить это в лучшем случае?В реальном наборе данных есть не только имя, но и фактически 5 столбцов.

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

1. можете ли вы немного объяснить вывод следующей строки 1 в теле вопроса?

2. Почему ты вообще это делаешь? Может быть, есть более простой способ для вас лучше решить вашу реальную основную проблему!

3. Ну, вот в чем проблема: у меня длинный список контактов. В течение следующих недель мне нужно создать пару пар, но пары не могут повторяться. Так что рандомизация будет простой. Между ними может случиться так, что в список будут добавлены новые записи. Я думал, что это будет тривиально, но, видимо…

4. Возможно, одним из решений было бы фактически рандомизировать, сохранить совпадения как уникальный идентификатор, а затем в следующем запуске позволить рандомизировать все, пока не будет совпадения с уникальным идентификатором. Это просто кажется немного неуклюжим. Было бы намного лучше позволить списку сдвинуться на число, чтобы выполнить задачу.

Ответ №1:

В комментариях вы отмечаете, что хотите создать пары, которые не повторяются. Это комбинации. Следовательно, более простым способом является создание допустимых комбинаций с использованием itertools.combinations()

 df = pd.read_csv(io.StringIO("""   name
0  John
1  Max
2  Ethan
3  Caren
4  Carl
5  Jenny
6  Claudia"""),sep="s ")

import itertools

pd.DataFrame(itertools.combinations(df.name.to_list(),2), columns=["name","name_2"])

 
Имя имя_2
0 Джон Макс
1 Джон Итан
2 Джон Карен
3 Джон Карл
4 Джон Дженни
5 Джон Клаудия
6 Макс Итан
7 Макс Карен
8 Макс Карл
9 Макс Дженни
10 Макс Клаудия
11 Итан Карен
12 Итан Карл
13 Итан Дженни
14 Итан Клаудия
15 Карен Карл
16 Карен Дженни
17 Карен Клаудия
18 Карл Дженни
19 Карл Клаудия
20 Дженни Клаудия