Как получить Матрицу происхождения судьбы от Json в Python? - PullRequest
0 голосов
/ 25 февраля 2019

Имея файл JSON, такой как:

[ {"fecha" : "2013-07-01","indicativo" : "3195","nombre" : "MADRID,RETIRO","orig" : "10","dest" : "122","value" : "15"},{"fecha" :"2013-07-02","indicativo" : "3195","nombre" : "MADRID, RETIRO","orig" :"15","dest" : "5","value" : "15"},{"fecha" : "2013-07-03","indicativo" :"3195","nombre" : "MADRID, RETIRO","orig" : "5","dest" : "15","value" :"15"},{"fecha" : "2013-07-04","indicativo" : "3195","nombre" : "MADRID,RETIRO","orig" : "10","dest" : "122","value" : "15"}]

Я пытаюсь получить матрицу, в которой значение поля orig равно значению строки y dest, как столбцу.В матрице я хотел бы иметь число вхождений, которые имеют это orig и dest.

Пример с предоставленными данными:

| data | 5 | 10 | 15 | 122 |
|------|---|----|----|-----|
| 5    | 0 | 0  | 1  | 0   |
| 10   | 0 | 0  | 0  | 2   |
| 15   | 1 | 0  | 0  | 0   |
| 122  | 0 | 0  | 0  | 0   |

В основном я хочу получить таблицу, которая показываетнапример, для orig = 10 и dest = 122 у меня есть вхождения в json 2.

Я понимаю, что мне нужно сначала paser json и преобразовать его в фрейм данных.

Проблема в том, чтокак только у меня есть этот df, как я могу создать матрицу с таким количеством строк, сколько у меня разных origin и dest (обратите внимание, что они являются базовыми идентификаторами, и если у меня есть число 122 в dest, но не в orig, это означает, что ни одна trvae не формируетсяэта точка, но некоторые из них приписаны к ней).

Думая, что я мог бы вообразить, что мне сначала нужно извлечь разные идентификаторы, которые у меня есть в orig и dest, а затем проанализировать каждую строку json и увеличить ее на единицу df[orig] [dest] позиция.Но есть ли другое более эффективное и быстрое решение для этого?

1 Ответ

0 голосов
/ 25 февраля 2019

Допустим, вы загрузили свой JSON-файл в list из dict с именем data:

df = pd.DataFrame(data)

df.groupby(['orig', 'dest']).size().unstack().fillna(0).astype(int)

. Это позволяет группировать все уникальные пары orig, dest и получать размер каждой из них.group (другими словами, сколько строк имеют эти два уникальных значения orig и dest), которые сформируют одно значение в конечном кадре данных.

С помощью unstack мы можем преобразовать один уровеньиндекса для имен столбцов, так что уникальные значения orig находятся в индексе, а значения для dest - в столбцах.

Наконец, мы заполняем нулевые значения (представляющие пары, которые не существовали) с 0 и приведите фрейм данных обратно к int для обеспечения презентабельности.

Тестирование со случайно сгенерированными данными:

orig_data = np.random.choice(['a', 'b', 'c', 'd', 'e'], 100, p=[0.35, 0.30, 0.20, 0.10, 0.05])
dest_data = np.random.choice(['a', 'b', 'c', 'd', 'e'], 100, p=[0.20, 0.25, 0.25, 0.20, 0.10])

data = [{'orig': orig, 'dest': dest} for orig, dest in zip(orig_data, dest_data)]

df = pd.DataFrame(data)

df.groupby(['orig', 'dest']).size().unstack().fillna(0).astype(int)

Вывод:

dest   a  b  c  d  e
orig                
a      4  9  8  4  3
b     11  8  5  4  6
c      5  2  3  4  5
d      4  3  3  1  3
e      1  0  3  1  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...