У меня есть следующие панды DataFrame в Python3.x, с двумя столбцами строк.
import pandas as pd
dict1 = {'column1':['MXRBMVQDHF', 'LJNVTJOY', 'WHLAOECVQR'],
'column2':['DPBVNJYANX', 'UWRAWDOB', 'CUTQVWHRIJ'], 'start':[79, 31, 52]}
df1 = pd.DataFrame(dict1)
print(df1)
# column1 column2 start
# 0 MXRBMVQDHF DPBVNJYANX 79
# 1 LJNVTJOY UWRAWDOB 31
# 2 WHLAOECVQR CUTQVWHRIJ 52
Каждая строка содержит строки одинаковой длины. Эти строки индексируются определенным образом, и я пишу словарь, используемый для перевода между координатами. Строка в столбце column1
основана на 0 (как и ожидалось). Целое число в столбце start
предназначено для представления «начального индекса» строки в column2
. В первом ряду начальный индекс равен 79.
Цель - создать словарь на основе индексов. Итак, для первой строки строка в column1
начинается с 0
, строка в column2
начинается с 79
. Словарь "преобразования" этих координат выглядит следующим образом:
{0: 79, 1: 80, 2: 81, 3: 82, 4: 83, 5: 84, 6: 85, 7: 86, 8: 87, 9: 88}
Моя цель - создать новый столбец в фрейме данных панд с этими словарями. Это довольно просто сделать (хотя есть и более быстрый способ с .apply()
, я подозреваю.):
for index, row in df1.iterrows():
df1.loc[index,'new'] = [{i: i + row['start'] for i, e in enumerate(row['column1'])}]
Теперь в df1
есть столбец с именем new
:
df1.new
0 {0: 79, 1: 80, 2: 81, 3: 82, 4: 83, 5: 84, 6: ...
1 {0: 31, 1: 32, 2: 33, 3: 34, 4: 35, 5: 36, 6: ...
2 {0: 52, 1: 53, 2: 54, 3: 55, 4: 56, 5: 57, 6: ...
Name: new, dtype: object
Моя проблема заключается в следующем: допустим, в столбце column1
несколько записей одной и той же строки. Вот пример:
import pandas as pd
dict2 = {'column1':['MXRBMVQDHF', 'LJNVTJOY', 'LJNVTJOY', 'LJNVTJOY', 'WHLAOECVQR'], 'column2':['DPBVNJYANX', 'UWRAWDOB', 'PEKUYUQR', 'WPMLFVFZ', 'CUTQVWHRIJ'], 'start':[79, 31, 52, 84, 18]}
df2 = pd.DataFrame(dict2)
print(df2)
# column1 column2 start
# 0 MXRBMVQDHF DPBVNJYANX 79
# 1 LJNVTJOY UWRAWDOB 31
# 2 LJNVTJOY PEKUYUQR 52
# 3 LJNVTJOY WPMLFVFZ 84
# 4 WHLAOECVQR CUTQVWHRIJ 18
В этом случае словарь для координат с LJNVTJOY
должен быть:
{0: [31, 52, 84], 1: [32, 53, 85], 2: [33, 54, 86], 3: [34, 55, 87],
4: [35, 56, 88], 5: [36, 57, 89], 6: [37, 58, 90], 7: [38, 59, 91]}
- словарь списков на основе
{0: 31, 1: 32, 2: 33, 3: 34, 4: 35, 5: 36, 6: 37, 7: 38}
{0: 52, 1: 53, 2: 54, 3: 55, 4: 56, 5: 57, 6: 58, 7: 59}
{0: 84, 1: 85, 2: 86, 3: 87, 4: 88, 5: 89, 6: 90, 7: 91}
РЕДАКТИРОВАТЬ: Вот правильный вывод. Существует DataFrame со столбцом 'new'
, который выглядит следующим образом:
df2.new
0 {0: 79, 1: 80, 2: 81, 3: 82, 4: 83, 5: 84, 6: ...
1 {0: [31, 52, 84], 1: [32, 53, 85], 2: [33, 54, 86], 3: [34, 55, 87], 4: [35, 56, 88], 5: [36, 57, 89], 6: [37, 58, 90], 7: [38, 59, 91]}
2 {0: 52, 1: 53, 2: 54, 3: 55, 4: 56, 5: 57, 6: ...
Name: new, dtype: object