#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 | Дженни | Клаудия |