Получить правильную последовательность элементов

Рейтинг: 0Ответов: 1Опубликовано: 30.03.2023

Имеется датафрейм следующего вида:

q = [['table 2', 'C'],
 ['table 2', 'D'],
 ['table 3', 'C'],
 ['table 6', 'C'],
 [nan, nan],
 ['table 2', 'B'],
 ['table 3', 'B'],
 ['table 6', 'B'],
 [nan, nan],
 ['table 4', 'C5'],
 ['table 4', 'C6'],
 [nan, nan],
 ['table 42', 'C'],
 ['table 43', 'C'],
 [nan, nan],
 ['table 4', 'B5'],
 ['table 4', 'B6'],
 [nan, nan],
 ['table 42', 'B'],
 ['table 43', 'B']]

Названия колонок:

columns = ['source', 'own']

Необходимо получить следующую последовательность элементов (пока не знаю, какая структура данных лучше всего подойдет)

dict1 = {'2': ['C', 'D'],
 '3': ['C'],
 '6': ['C'],
 '2': ['B'],
 '3': ['B'],
 '6': ['B'],
 '4': ['C5', 'C6'],
 '42': ['C'],
 '43': ['C'],
 '4': ['B5', 'B6'],
 '42': ['B'],
 '43': ['B']
}

То есть необходимо сохранить текущую последовательность первых элементов списков из списка q. Знаю, что в словаре нельзя иметь одинаковые ключи, поэтому пока не могу понять, какая структура лучше подойдет.

Есть решение из моего предыдущего вопроса

def get_correct_column_order(data_schema):           
    mask = data_schema['source'].isnull() & (data_schema['source'].ffill() == data_schema['source'].bfill())
    data_schema.loc[mask, 'source'] = data_schema['source'].ffill().loc[mask]
    data_schema['own'].fillna('', inplace=True)
    correct_column_order = data_schema.groupby('source', sort=False).agg(list)['own'].to_dict()
    return correct_column_order

df = pd.DataFrame(q, columns=columns)
get_correct_column_order(df)

И такое решение выдает следующий результат, который мне не подходит

dict2 = {'2': ['C', 'D', 'B'],
 '3': ['C', 'B'],
 '6': ['C', 'B'],
 '4': ['C5', 'C6', 'B5', 'B6'],
 '42': ['C', 'B'],
 '43': ['C', 'B'],
}

Ответы

▲ 1Принят

Ну я вижу простое разбиение датафрейма по nan, группировку и конвертацию в словарь:

df["groups"] = df.isnull().all(axis=1).cumsum()
df = df.dropna()
res = df.groupby(["groups", 0]).apply(lambda x: list(x[1])).to_dict()

res:

{(0, 'table 2'): ['C', 'D'],
 (0, 'table 3'): ['C'],
 (0, 'table 6'): ['C'],
 (1, 'table 2'): ['B'],
 (1, 'table 3'): ['B'],
 (1, 'table 6'): ['B'],
 (2, 'table 4'): ['C5', 'C6'],
 (3, 'table 42'): ['C'],
 (3, 'table 43'): ['C'],
 (4, 'table 4'): ['B5', 'B6'],
 (5, 'table 42'): ['B'],
 (5, 'table 43'): ['B']}