SQL 查询,用于为 4 个数据库列的每个不同值组合创建单独的数据帧



如何在 Python 中从 Oracle 数据库表中所有可能的 4 列组合创建多个数据帧?

如何编写这样的 SQL 查询,其中提取的所有记录都将加载到我的数据帧?我正在使用甲骨文12c

假设我的列名称是"A"、"B"、"C"、"D"。它们在我的数据库表中的不同值数量分别为 4、3、2、6。这里可能的总组合是 4*3*2*6 = 144。所以基本上我需要 144 个数据帧。

现在,我想在一个数据帧中加载从这些值的一个组合(假设 A1-B1-C1-D1(获取的所有记录,在

下一个数据帧中加载从这些值的其他组合(A1-B1-C1-D2(获取的所有记录,依此类推。

我对这整件事很陌生,所以被困在这里。

您的查询最终不会按原样下载整个表吗?如果您找到 A、B、C、D 列的每个不同组合,然后将您的表联接到这些组合中,那么您只需返回原始表即可。

您可以创建一个连接 A,B,C,D 值的新列吗?

select
  A || '-' || B || '-' || C || '-' || D as ABCD
, A
, B
, C
, D
from my_table

输出将是:

ABCD           A    B    C    D
A1-B1-C1-D1    A1   B1   C1   D1
A1-B1-C1-D2    A1   B1   C1   D2

将其引入数据帧,如下所示:

import pandas as pd
query = """
        select
          A || '-' || B || '-' || C || '-' || D as ABCD
          , A
          , B
          , C
          , D
        from my_table
        """
df = pd.read_sql(sql = query, con = conn)

现在,你有一个包含新列 ABCD 的数据帧,可用于对所有 A、B、C、D 方案进行分组。我强烈建议不要将它们分解为单独的数据帧。我想知道你为什么要这样做?

如果要引用特定方案,则只需执行以下操作:

df[df['ABCD'] == 'A1-B1-C1-D1']

您需要SELECT每组值并将它们CROSS JOIN在一起。 例如,

SELECT     a, b, c, d
FROM       ( SELECT a FROM my_table ) xa
CROSS JOIN ( SELECT b FROM my_table ) xb
CROSS JOIN ( SELECT c FROM my_table ) xc
CROSS JOIN ( SELECT d FROM my_table ) xd

您可能希望修改子查询以选择DISTINCT值。

这将为您提供一个结果集,其中包含四列中值的所有可能组合。

现在,我想在一个数据帧中加载从这些值的一个组合(假设 A1-B1-C1-D1(获取的所有记录,在

下一个数据帧中加载从这些值的其他组合(A1-B1-C1-D2(获取的所有记录,依此类推。

我不知道什么是"数据帧",所以我无法帮助您解决这一部分。

假设 Python 的pandas库,请考虑按原样加载整个查询,然后运行 groupby 以构建包含 144 个数据帧的列表或字典。这回答了:

如何从 4 列的所有可能组合创建多个数据帧...?

最好将

许多类似的结构化对象存储在一个容器中,而不是 144 个单独的对象淹没全局环境。如果存储在列表或字典中,则不会丢失数据框的功能。

sql_df = pd.read_sql("""SQL Query""", conn)
# DICTIONARY COMPREHENSION
df_dict = {i:g for i,g in sql_df.groupby(['A', 'B', 'C', 'D']) }
# REFERENCE INDIVIDUAL DFs WITH TUPLE KEYS
df_dict[(A1, B1, C1, D1)].head()
df_dict[(A1, B1, C1, D2)].describe()
df_dict[(A1, B1, C1, D3)].tail()

若要避免元组键,请使用下划线将值映射到单个字符串键中:

df_dict = {"_".join(map(str, i)):g for i,g in sql_df.groupby(['A', 'B', 'C', 'D']) }
# REFERENCE INDIVIDUAL DFs WITH TUPLE KEYS
df_dict['A1_B1_C1_D1'].head()
df_dict['A1_B1_C1_D2'].describe()
df_dict['A1_B1_C1_D3'].tail()

最新更新