Преобразование вложенного списка в pandas фрейм данных с именами столбцов - PullRequest
2 голосов
/ 01 мая 2020

Изображение исходного DataFrame

У меня есть вложенный список, который выглядит примерно так:

features = 
[['0:0.084556', '1:0.138594', '2:0.094304\n'],
 ['0:0.101468', '4:0.138594', '5:0.377215\n'],
 ['0:0.135290', '2:0.277187', '3:0.141456\n']
]

Каждый список во вложенном списке представляет собой строку, которая является разделенные запятой. Левая часть «:» - это имя столбца, а правая - значение строки.

Я хочу преобразовать это в pandas фрейм данных, чтобы он выглядел следующим образом:

  f_0000  |  f_0001  |  f_0002  |  f_0003  |  f_0004  | f_0005
---------------------------------------------------------------
 0.084556 | 0.138594 | 0.094304 | 0.000000 | 0.000000 | 0.000000
 0.101468 | 0.000000 | 0.000000 | 0.000000 | 0.138594 | 0.377215
 0.135290 | 0.000000 | 0.277187 | 0.141456 | 0.000000 | 0.000000

Может кто-нибудь помочь мне с тем, как это сделать?

Оригинал DF (для меня он не форматируется правильно на pd.read_clipboard ..)

    ex_id   labels  features
0   0   446,521,1149,1249,1265,1482 0:0.084556 1:0.138594 2:0.094304 3:0.195764 4:...
1   1   78,80,85,86 0:0.050734 1:0.762265 2:0.754431 3:0.065255 4:...
2   2   457,577,579,640,939,1158    0:0.101468 1:0.138594 2:0.377215 3:0.130509 4:...
3   3   172,654,693,1704    0:0.186024 1:0.346484 2:0.141456 3:0.195764 4:...
4   4   403,508,1017,1052,1731,3183 0:0.135290 1:0.277187 2:0.141456 3:0.065255 4:...

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Я думаю, что простым останется for петель.

  1. Сначала выберите все ключи из заданного features.

    1. Для всех элементов мы используем str.split и извлекаем первый элемент.
    2. Тогда, поскольку нам нужны только уникальные ключи, мы используем 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}

Переберите все функции:

  1. Сохраните все посещенные ключевые функции в seen переменной
  2. Добавьте все избранные ключи и значения
  3. Заполните данные ключами, которых нет в текущем 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
0 голосов
/ 01 мая 2020

попробуйте это:

df = pd.DataFrame(data, columns = ['Column name 1'], ['column name 2'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...