У меня есть список кортежей вроде:
tuple_lst = [('foo', 'bar'), ('bar', 'foo'), ('ping', 'pong'), ('pong', 'ping')]
И я хочу создать Dataframe с одним столбцом, содержащим каждую пару кортежей, например:
| one col |
| -------- |
| ('foo', 'bar') |
| ('bar', 'foo') |
| ('ping', 'pong') |
| ('pong', 'ping') |
Я пытался:
df = pd.DataFrame(tuple_lst, columns='one col')
Но это вызывает ошибку, поскольку он пытается разделить кортежи на два отдельных столбца. Я знаю, что если я передам сюда список из двух имен столбцов, он создаст фрейм данных с двумя столбцами, а это не то, что мне нужно. Думаю, я мог бы затем снова объединить эти два столбца в список кортежей, но мне кажется, что разбить их и снова собрать вместе — это огромная работа. Я чувствую, что должен быть более простой способ сделать это? Мне нужно, чтобы выходные данные представляли собой фрейм данных, а не серию, чтобы я мог позже добавить другие столбцы и т. д.
Используйте словарь, это гарантирует, что конструктор DataFrame не будет пытаться интерпретировать данные как 2D:
pd.DataFrame({'one col': tuple_lst})
Вы также можете использовать Series и преобразовать в_frame:
pd.Series(tuple_lst).to_frame(name='one col')
Или, ближе к вашему исходному подходу, который может быть полезен, если у вас есть ограничения на формат, передаваемый в конструктор. Хотя и не так эффективно (для небольших списков):
pd.DataFrame(pd.Series(tuple_lst), columns=['one col'])
Выход:
one col
0 (foo, bar)
1 (bar, foo)
2 (ping, pong)
3 (pong, ping)
Для небольших списков pd.DataFrame(pd.Series(tuple_lst), columns=['one col'])
не так эффективно, но для больших списков все решения эквивалентны:
Спасибо :) Я знал, что будет простой способ!
@mozway - всегда с удовольствием читаю твои ответы
Я погуглил «как составить список кортежей в один столбец панд», и дублирующийся вопрос не появился, только вопросы, которые разделяют кортежи на два столбца. Странно, что именно тот вопрос, который я задавал, не появился, но спасибо, что указали мне на него :)