Я думаю, что простым останется for
петель.
Сначала выберите все ключи из заданного features
.
- Для всех элементов мы используем
str.split
и извлекаем первый элемент. - Тогда, поскольку нам нужны только уникальные ключи, мы используем
set
. Затем мы конвертируем его обратно в list
и сортируем ключи, используя sorted
( здесь некоторые детали, если необходимо).
Первое суммируется в:
keys = sorted(list(set([elt.split(':')[0] for l in features for elt in l])))
Создайте пустой ключ
dict
из указанных выше ключей и инициализируйте все ключи пустым списком:
data = {k:[] for k in keys}
Переберите все функции:
- Сохраните все посещенные ключевые функции в
seen
переменной - Добавьте все избранные ключи и значения
- Заполните данные ключами, которых нет в текущем
features
В конце концов, создайте информационный кадр из out dict, используя конструктор по умолчанию [pd.DataFrame()
] (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html).
Правильно отформатируйте имя столбца, используя .columns
и форматирование строки (format
). Здесь есть несколько хороших объяснений.
Достаточно поговорим, здесь полный код + иллюстрация :
features = [["0:0.084556", "1:0.138594", "2:0.094304"],
["0:0.101468", "4:0.138594", "5:0.377215"],
["0:0.135290", "2:0.277187", "3:0.141456"]
]
# Step 1
keys = sorted(list(set([elt.split(':')[0] for l in features for elt in l])))
print(keys)
# ['0', '1', '2', '3', '4', '5']
# Step 2
data = {k:[] for k in keys}
print(data)
# {'0': [], '1': [], '2': [], '3': [], '4': [], '5': []}
# Step 3
for sub in features:
# Step 3.1
seen = []
# Step 3.2
for l in sub:
k2, v = l.split(":") # Get key and value
data[k2].append(float(v)) # Append current value to data
seen.append(k2) # Set the key as seen
# Step 3.3
for k in keys: # For all data keys
if k not in seen: # If not seen
data[k].append(0) # Add 0
print(data)
# {'0': [0.084556, 0.101468, 0.13529],
# '1': [0.138594, 0, 0],
# '2': [0.094304, 0,0.277187],
# '3': [0, 0, 0.141456],
# '4': [0, 0.138594, 0],
# '5': [0, 0.377215, 0]
# }
# Step 4
df = pd.DataFrame(data)
print(df)
# 0 1 2 3 4 5
# 0 0.084556 0.138594 0.094304 0.000000 0.000000 0.000000
# 1 0.101468 0.000000 0.000000 0.000000 0.138594 0.377215
# 2 0.135290 0.000000 0.277187 0.141456 0.000000 0.000000
# Step 5
df.columns = ["f_{:04d}".format(int(val)) for val in df.columns]
print(df)
# f_0000 f_0001 f_0002 f_0003 f_0004 f_0005
# 0 0.084556 0.138594 0.094304 0.000000 0.000000 0.000000
# 1 0.101468 0.000000 0.000000 0.000000 0.138594 0.377215
# 2 0.135290 0.000000 0.277187 0.141456 0.000000 0.000000