如何在 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()