【问题标题】:Pandas Dataframe Encoding Vector from ManyToMany Join Table in Sqlite3来自Sqlite3中ManyToMany连接表的Pandas Dataframe编码向量
【发布时间】:2019-11-04 19:31:28
【问题描述】:

所以我有三个表(A、A_to_B、B),其中一个是用于多->多关系的连接表......我需要创建一个数据框,其中包含 B 中每个 id 的标志数组(连接表中是否存在事务),对于 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)

【问题讨论】:

  • 那你是用sql还是python操作呢?
  • 我不在乎,只要速度快,最后我有一个 pandas DataFrame

标签: python sql pandas sqlite dataframe


【解决方案1】:
# 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'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2021-06-23
    • 2013-11-09
    • 2014-02-24
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    相关资源
    最近更新 更多