У меня есть огромный фрейм данных. Данные выглядят так:
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






Во-первых, переназначить сначала отфильтрованный 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?