Я новичок в 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? Это опечатка для TorF? Что вы хотите получить в результате? (человеческими словами)
@МарияКозлова, да. Мне жаль. Починил это.






Получение соотношения двух фигур — хорошая стратегия.
Однако я бы использовал 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
Я добавил желаемый результат. Я мог бы прояснить, что я ищу.
@EricFail с использованием man_corr_n = list(range(10)) было бы еще менее двусмысленным;)
Я должен был быть более ясным в своем комментарии выше. Вывод в вашем ответе не соответствует желаемому результату в моем вопросе.
@ Эрик, но ваше текущее «неуклюжее» решение не дает показанного результата. Под неуклюжим вы имели в виду, что это не «красиво» или что это не работает? То, как вы это сформулировали, казалось, указывало на то, что код работает. Пожалуйста, предоставьте вывод для TorF = list(range(10)), чтобы избежать двусмысленности при повторении True/False.
Судя по выходу шоу, это действительно может быть просто проблема изменения формы: df = pd.DataFrame(np.hstack([list(map(list, cat)), np.reshape(TorF, (len(cat), -1), order='F')]))
Вы можете сформировать массив 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
что такое
man_corr_n