Pandas pd.DataFrame из данных цикла

Я новичок в Python. У меня есть некоторые данные, которые я получаю из цикла. cat и быть между двумя и n и TorF всегда будет (cat*5) или (cat*4). Мое золото — создать pd.DataFrame из двух списков, вот так

cat = ['a', 'b'] 
TorF = [True, True, True, False, False, True, False, False, True, True]

Я думаю, что мое текущее решение немного неуклюже с int((len(man_corr_n)/len(cat))),

import pandas as pd 
data = [[c, *TorF[i:i+int((len(TorF )/len(cat)))]] for i, c in enumerate(cat)]
df = pd.DataFrame(data)

если есть более простой способ сделать это?

Мой желаемый результат

   0     1     2      3      4      5
0  a  True  True   False  False   True
1  b  True  False  True   False   True

что такое man_corr_n

juanpethes 13.07.2023 14:19

Что такое man_corr_n? Это опечатка для TorF? Что вы хотите получить в результате? (человеческими словами)

Maria Kozlova 13.07.2023 14:19

@МарияКозлова, да. Мне жаль. Починил это.

Eric Fail 13.07.2023 14:36
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Получение соотношения двух фигур — хорошая стратегия.

Однако я бы использовал slide_window_view:

import pandas as pd
from numpy.lib.stride_tricks import sliding_window_view as swv

cat = ['a', 'b']
man_corr_n = [True, True, True, False, False, True, False, False, True, True]

df = pd.DataFrame(swv(man_corr_n, len(man_corr_n)//len(cat))[:len(cat)],
                  index=cat).reset_index()

Или:

view = swv(man_corr_n, len(man_corr_n)//len(cat))[:len(cat)]
df = pd.DataFrame(np.hstack([np.array(cat)[:,None], view]))

Выход:

   0     1     2      3      4      5
0  a  True  True   True  False  False
1  b  True  True  False  False   True

редактировать: неоднозначный вывод

Предоставленный вами код и показанный ожидаемый результат явно конфликтуют. Используя однозначный ввод (TorF = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), ваш код дает:

   0  1  2  3  4  5
0  a  0  1  2  3  4
1  b  1  2  3  4  5

Хотя ваш ожидаемый результат выглядит следующим образом:

   0  1  2  3  4  5
0  a  0  2  4  6  8
1  b  1  3  5  7  9

В таком случае вам просто нужно изменить форму:

df = pd.DataFrame(np.reshape(np.r_[cat, TorF], (len(cat), -1), order='F'))

# or
df = pd.DataFrame(np.hstack([list(map(list, cat)), np.reshape(TorF, (len(cat), -1), order='F')]))

Выход:

   0     1      2      3      4     5
0  a  True   True  False  False  True
1  b  True  False   True  False  True

Я добавил желаемый результат. Я мог бы прояснить, что я ищу.

Eric Fail 13.07.2023 14:39

@EricFail с использованием man_corr_n = list(range(10)) было бы еще менее двусмысленным;)

mozway 13.07.2023 14:40

Я должен был быть более ясным в своем комментарии выше. Вывод в вашем ответе не соответствует желаемому результату в моем вопросе.

Eric Fail 13.07.2023 14:52

@ Эрик, но ваше текущее «неуклюжее» решение не дает показанного результата. Под неуклюжим вы имели в виду, что это не «красиво» или что это не работает? То, как вы это сформулировали, казалось, указывало на то, что код работает. Пожалуйста, предоставьте вывод для TorF = list(range(10)), чтобы избежать двусмысленности при повторении True/False.

mozway 13.07.2023 14:54

Судя по выходу шоу, это действительно может быть просто проблема изменения формы: df = pd.DataFrame(np.hstack([list(map(list, cat)), np.reshape(TorF, (len(cat), -1), order='F')]))

mozway 13.07.2023 14:59

Вы можете сформировать массив Numpy из двух списков, изменить форму, транспонировать и сформировать DataFrame:

import numpy as np
import pandas as pd

cat = ['a', 'b']
TorF = [True, True, True, False, False, True, False, False, True, True]
TorF = np.array(cat + TorF)
TorF2 = TorF.reshape(len(TorF)//2, 2)
df = pd.DataFrame(TorF2.T)

давая:

   0     1      2      3      4     5
0  a  True   True  False  False  True
1  b  True  False   True  False  True

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