如何使用Python的Oracle数据库表中的4列的所有可能组合创建多个数据框?
如何编写这样的SQL查询,其中所有提取的记录都将加载到我的数据框中?我正在使用Oracle12c
可以说我的列名是“ A”,“ B”,“ C”,“ D”。我的数据库表中其不同值的数量分别为4、3、2、6。在这里,总的组合可能是4 * 3 * 2 * 6 =144。所以基本上我需要144个数据帧。
现在,我想在一个数据帧中加载从这些值的一种组合(比如说A1-B1-C1-D1)获取的所有记录,从其他组合的这些值(A1-B1-C1-D2)获取的所有记录在下一个数据帧中,依此类推。
我对这件事很陌生,所以被困在这里。
答案 0 :(得分:1)
您需要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)获取的所有记录在下一个数据帧中,依此类推。
我不知道什么是“数据框”,所以我无法帮助您完成这一部分。
答案 1 :(得分:1)
您的查询是否最终将原样下载整个表?如果找到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']
答案 2 :(得分:1)
假设Python的pandas
库,请考虑按原样加载 entire 查询,然后运行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()