Pandas long format DataFrame из нескольких списков разной длины

Считайте, что у меня есть несколько списков

A = [1, 2, 3]
B = [1, 4]

и я хочу создать Pandas DataFrame в длинном формате следующим образом:

type | value
------------
A    | 1
A    | 2
A    | 3
B    | 1
B    | 4

Как проще всего этого добиться? Путь по широкому формату и таянию невозможен (?), Потому что списки могут иметь разную длину.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
310
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Создайте словарь для type и составьте список кортежей по его пониманию:

A = [1, 2, 3]
B = [1, 4]

d = {'A':A,'B':B}

print ([(k, y) for k, v in d.items() for y in v])
[('A', 1), ('A', 2), ('A', 3), ('B', 1), ('B', 4)]

df = pd.DataFrame([(k, y) for k, v in d.items() for y in v], columns=['type','value'])
print (df)
  type  value
0    A      1
1    A      2
2    A      3
3    B      1
4    B      4

Другое решение, если ввод - это список списков, а type должны быть целыми числами:

L = [A,B]
df = pd.DataFrame([(k, y) for k, v in enumerate(L) for y in v], columns=['type','value'])
print (df)
   type  value
0     0      1
1     0      2
2     0      3
3     1      1
4     1      4

Проверьте это, это заимствует идею из 3-х библиотек языков программирования dplyr, tidyr, R, следующий код предназначен только для демонстрации, поэтому я создал два df: df1, df2, вы можете динамически создавать dfs и объединять их:

import pandas as pd


def gather(df, key, value, cols):
    id_vars = [col for col in df.columns if col not in cols]
    id_values = cols
    var_name = key
    value_name = value
    return pd.melt(df, id_vars, id_values, var_name, value_name)


df1 = pd.DataFrame({'A': [1, 2, 3]})

df2 = pd.DataFrame({'B': [1, 4]})

df_messy = pd.concat([df1, df2], axis=1)

print(df_messy)

df_tidy = gather(df_messy, 'type', 'value', df_messy.columns).dropna()

print(df_tidy)

И у вас есть вывод для df_messy

   A    B
0  1  1.0
1  2  4.0
2  3  NaN

вывод для df_tidy

  type  value
0    A    1.0
1    A    2.0
2    A    3.0
3    B    1.0
4    B    4.0

PS: Не забудьте преобразовать тип значений из типа float в тип int, я просто записал это для демонстрации и не уделял слишком много внимания деталям.

Вот решение на основе NumPy с использованием словарного ввода:

d = {'A': [1, 2, 3],
     'B': [1, 4]}

keys, values = zip(*d.items())

res = pd.DataFrame({'type': np.repeat(keys, list(map(len, values))),
                    'value': np.concatenate(values)})

print(res)

  type  value
0    A      1
1    A      2
2    A      3
3    B      1
4    B      4

Другие вопросы по теме