【问题标题】:SQL query 1 col & 1000 rows to pandas dataframe 10 cols&100 rowsSQL 查询 1 列和 1000 行到 pandas 数据框 10 列 100 行
【发布时间】:2016-02-13 14:35:21
【问题描述】:

我需要你的帮助来解决这个棘手的问题。我有一个包含一列和 1000 行的 SQL 查询结果。这个 SQL 查询实际上是一个表的自连接查询,1000 个实际上是 10 组相同的 100 个 ids. So the question is: How can I change the dimensions of this SQL query result in order to process it with pandas dataFrame? I know that pandas dataframes are always 2d and I cant 使用 pandas.pivot 因为我没有唯一索引。

编辑1:

我想做的一个例子。

SQL查询结果

1 列和 N1 到 N1000 行

必要的数据框

列:Column1 / Column2 / Column3 / Column4 /(依此类推)

行:N1 到 N100 / N101 到 N200 / N201 到 N300 / N301 到 N400 /(依此类推)

编辑2: 一个带值的小例子。SQL 查询基于一个包含 5 个人及其年龄的表的自联接。查询中的值是每次两个人的年龄差。

SQL 查询

年龄差异

N1(=人 1 和人 1 的年龄差)

N2(=人 1 和人 2 的年龄差)

N3(=人 1 和人 3 的年龄差)

N4(=人 1 和人 4 的年龄差)

N5(=人 1 和人 5 的年龄差)

N6(=人 2 和人 1 的年龄差)

N7(=人 2 和人 2 的年龄差)

N8(=人物 2 和人物 3 的年龄差)

N9(=人物 2 和人物 4 的年龄差)

N10(=人 2 和人 5 的年龄差)

...

N25(=第五个人和第五个人的年龄差)

必要的数据框

Person1----Person2-----Person3-----Person4- ----Person5

N1-------------N6-------------N11-------------N16---- ---------N21

N2-------------N7-------------N12-------------N17---- ---------N22

N3-------------N8-------------N13-------------N18---- ---------N23

N4-------------N9-------------N14-------------N19---- ---------N24

N5-------------N10------------N15-------------N20----- --------N25

【问题讨论】:

  • 你的“SQL查询结果”是python对象吗?什么类型?
  • 没有。在我使用 pandas 或 numpy 之前,我想知道所有重塑结果的方法。

标签: python sql pandas dataframe


【解决方案1】:

很难理解你的任务,但这里有一个简单的例子,它给你一个开始的想法:

>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> conn.execute('create table test (id int, value int)')
>>> conn.execute('insert into test select 1, 1 union all select 2, 2')
>>> df = pd.read_sql('select t1.id, t2.id, t1.value * t2.value from test as t1 cross join test as t2', conn)
>>> df
   id1  id2  value
0    1    1      1
1    1    2      2
2    2    1      2
3    2    2      4
>>> df.columns = ['id1','id2','value']
>>> df.pivot(index='id1', columns='id2')
    value   
id2     1  2
id1         
1       1  2
2       2  4

编辑

>>> conn.execute('insert into ages select 6 union all select 24 union all select 14 union all select 16 union all select 65')
>>> df = pd.read_sql('select t1.age - t2.age from ages as t1 cross join ages as t2', conn)
>>> df.column = ['diff']
>>> a = pd.DataFrame.from_records(product(range(5), range(5)), columns=['a','b'])
>>> res = pd.concat([df, a],axis=1)
>>> res.pivot(index='a', columns='b', values='diff')
b   0   1   2   3   4
a                    
0   0 -18  -8 -10 -59
1  18   0  10   8 -41
2   8 -10   0  -2 -51
3  10  -8   2   0 -49
4  59  41  51  49   0

【讨论】:

  • 我明白你做了什么,但你的结果在逻辑上与我想要的有点不同。我用一个我需要的例子编辑了我的问题。我尝试按照您的建议使用 pivot 并且收到错误消息 ValueError: cannot label index with a null key (虽然它不是 null) 或 ValueError: Index contains duplicate entries, cannot reshape.
  • 为什么需要这样做?只需从数据库中获取一组 id,然后复制它
  • 因为 N1 到 N1000 的值都互不相同。
  • 哪些值?你说你有 1 列 (id) 并且这些 id 是重复的。我会考虑创建您的输入的简单示例,尺寸更小,输出更小
  • 这正是我所需要的。非常感谢 Roman Pekar 先生。
猜你喜欢
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
相关资源
最近更新 更多