Вектор кодирования данных Pandas из таблицы соединений ManyToMany в Sqlite3 - PullRequest
0 голосов
/ 04 ноября 2019

Итак, у меня есть три таблицы (A, A_to_B, B), одна из которых является таблицей соединений для многих -> многих отношений ... Мне нужно создать информационный кадр, который содержит массив флагов для каждого идентификатора в B (существует ли транзакция в таблице соединений), для каждой строки в A ... Очень сложно объяснить, но ниже приведены примеры таблиц ...

A_to_B             A                  B
+------+------+    +------+------+    +------+------+
| id_a | id_b |    | id   | val  |    | id   | val  |
+------+------+    +------+------+    +------+------+
|  1   |  2   |    |  1   | foo  |    |  1   | foob |
+------+------+    +------+------+    +------+------+
|  1   |  3   |    |  2   | bar  |    |  2   | barb |
+------+------+    +------+------+    +------+------+
|  2   |  3   |    |  3   | baz  |    |  3   | bazb |
+------+------+    +------+------+    +------+------+

И я хочу закончить скадр данных, который выглядит следующим образом

     1     2     3
_______________________
 1   0     1     1     # id 1 from table A contains entries for ids 2/3 in B
 2   0     0     1     # id 2 from table A contains entry for id 3 in B
 3   0     0     0     # id 3 contains no transactions in the join table

Надеюсь, это имеет смысл. Кроме того, имейте в виду, что это должен быть эффективный sqlite запрос, поскольку я имею дело с потенциально десятками тысяч строк из каждой таблицы.

Каждая таблица загружена в отдельный фрейм данных, как следует (но, конечно, это никоим образом не является ограничением для решения этой проблемы).

import pandas as pd
import sqlite3

conn = sqlite3.connect('database.sqlite3')
cur = conn.cursor()

df_A = pd.read_sql_query('SELECT * FROM A', conn)
df_B = pd.read_sql_query('SELECT * FROM B', conn)
df_A_to_B = pd.read_sql_query('SELECT * FROM A_to_B', conn)

1 Ответ

1 голос
/ 04 ноября 2019
# input
df = pd.DataFrame({'A':[1,1,2], 'B':[2,3,3]})
dfa = pd.DataFrame({'A':[1,2,3], 'tt':['f','b','z']})
dfb = pd.DataFrame({'B':[1,2,3], 'tt':['fb','bb','zb']})

# output
a = pd.Categorical(df['A'], categories=dfa['A'])
b = pd.Categorical(df['B'], categories=dfb['B'])
pd.crosstab(a, b, dropna=False, rownames=['A'], colnames=['B'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...