Матрица преобразования — отображение всех нулевых значений

У меня есть огромный фрейм данных. Данные выглядят так:

Person  Distance    BS
A       125.58      BS3
A       212.01      BS4
B       11.41       BS3
B       134.35      BS2
C       11.41       BS3
C       274.20      BS2
D       220.98      BS5
D       8.01        BS7
E       606.05      BS1
E       676.88      BS2
F       28.81       BS7
F       98.69       BS5
G       81.64       BS1
G       35.49       BS3

Я преобразовываю этот набор данных в матрицу OD на основе этого вопроса Возможно ли преобразование фрейма данных в матрицу? с помощью этого кода:

df = pd.read_csv("data.csv")
df = df[df.Distance < 100]
df = df[df.groupby('Person').Person.transform(len) > 1]
places = df["BS"].unique()
places.sort()
od_df = pd.DataFrame(df["BS"].values.reshape((-1, 2)), columns=["O", "D"])
od_matrix = pd.pivot_table(od_df, index = "O", columns = "D", aggfunc = "size").reindex(index=places, columns=places)
od_matrix.fillna(0, downcast = "infer", inplace=True)
od_matrix

Я хочу устранить расстояние выше 100 метров. Поэтому ставлю distance < 100. Результат выглядит следующим образом:

D   BS1 BS3 BS5 BS7
O               
BS1 0   1   0   0
BS3 0   0   0   0
BS5 0   0   0   0
BS7 0   0   1   0

если мои огромные данные от BS1 до BS9, после исключения столбец матрицы и строка без данных (0) также исчезнут. Как показать событие всех столбцов и строк, если нет данных (0)?. Я хочу показать, что матрица выглядит так:

D   BS1 BS2 BS3 BS4 BS5 BS6 BS7 BS8 BS9
O                                   
BS1 0   0   1   0   0   0   0   0   0
BS2 0   0   0   0   0   0   0   0   0
BS3 0   0   0   0   0   0   0   0   0
BS4 0   0   0   0   0   0   0   0   0
BS5 0   0   0   0   0   0   0   0   0
BS6 0   0   0   0   0   0   0   0   0
BS7 0   0   0   0   1   0   0   0   0
BS8 0   0   0   0   0   0   0   0   0
BS9 0   0   0   0   0   0   0   0   0
Почему в 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
0
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Во-первых, переназначить сначала отфильтрованный DataFrame в df1, получить уникальный places путем понимания списка с помощью f-строк и добавить параметр fill_value=0 к функциям pivot_table и reindex:

df1 = df[df.Distance < 100]
df1 = df1[df1.groupby('Person').Person.transform(len) > 1]
places = [f'BS{ x + 1}' for x in range(9)]
print (places)
['BS1', 'BS2', 'BS3', 'BS4', 'BS5', 'BS6', 'BS7', 'BS8', 'BS9']


od_df = pd.DataFrame(df1["BS"].values.reshape((-1, 2)), columns=["O", "D"])
od_matrix = (pd.pivot_table(od_df, index = "O", columns = "D", aggfunc = "size", fill_value=0)
               .reindex(index=places, columns=places, fill_value=0))

Или:

od_matrix = (pd.crosstab(od_df["O"], od_df["D"])
               .reindex(index=places, columns=places, fill_value=0))

print (od_matrix)
D    BS1  BS2  BS3  BS4  BS5  BS6  BS7  BS8  BS9
O                                               
BS1    0    0    1    0    0    0    0    0    0
BS2    0    0    0    0    0    0    0    0    0
BS3    0    0    0    0    0    0    0    0    0
BS4    0    0    0    0    0    0    0    0    0
BS5    0    0    0    0    0    0    0    0    0
BS6    0    0    0    0    0    0    0    0    0
BS7    0    0    0    0    1    0    0    0    0
BS8    0    0    0    0    0    0    0    0    0
BS9    0    0    0    0    0    0    0    0    0

Спасибо за твой ответ. как завершить BS (от BS1 до BS9), даже если значение равно 0?

Arief 19.06.2019 09:35

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