在Pandas to_sql中排序行

时间:2016-08-01 16:32:28

标签: python pandas

我订购了一个Pandas Dataframe。

             a0               b0  c0     d0 370025442 370020440 370020436  \
1    31/08/2014  First Yorkshire  53  05:10         0    0.8333    1.2167   
2    31/08/2014  First Yorkshire  53  07:10         0      0.85      1.15   
3    31/08/2014  First Yorkshire  53  07:40         0    0.5167    0.7833   
4    31/08/2014  First Yorkshire  53  08:10         0       0.7         1   
5    31/08/2014  First Yorkshire  53  08:40       NaN       NaN       NaN   
6    31/08/2014  First Yorkshire  53  09:00         0       0.5    0.7667   
7    31/08/2014  First Yorkshire  53  09:20         0    0.5833         1   
8    31/08/2014  First Yorkshire  53  09:40         0       0.4       0.7   
9    31/08/2014  First Yorkshire  53  10:20         0    0.5333    1.0333   
10   31/08/2014  First Yorkshire  53  10:40         0    0.4833         1   
11   31/08/2014  First Yorkshire  53  11:00         0    0.3667       0.7   
12   31/08/2014  First Yorkshire  53  11:20         0    0.5333      1.15   
13   31/08/2014  First Yorkshire  53  11:40         0    0.3333    0.7667   
14   31/08/2014  First Yorkshire  53  12:00         0    1.0167       1.5   
15   31/08/2014  First Yorkshire  53  12:40         0      0.75    1.0333   
..          ...              ...  ..    ...       ...       ...       ...   
737  25/10/2014  First Yorkshire  53  21:40         0    1.0167       1.3   
738  25/10/2014  First Yorkshire  53  22:40         0    0.5667         1

但是,当我将其转换为SQL时,排序会被更改(第13行以后)并变为:

             a0               b0  c0     d0 370025442 370020440 370020436  \
0    31/08/2014  First Yorkshire  53  05:10         0    0.8333    1.2167   
1    31/08/2014  First Yorkshire  53  07:10         0      0.85      1.15   
2    31/08/2014  First Yorkshire  53  07:40         0    0.5167    0.7833   
3    31/08/2014  First Yorkshire  53  08:10         0       0.7         1   
4    31/08/2014  First Yorkshire  53  08:40      None      None      None   
5    31/08/2014  First Yorkshire  53  09:00         0       0.5    0.7667   
6    31/08/2014  First Yorkshire  53  09:20         0    0.5833         1   
7    31/08/2014  First Yorkshire  53  09:40         0       0.4       0.7   
8    31/08/2014  First Yorkshire  53  10:20         0    0.5333    1.0333   
9    31/08/2014  First Yorkshire  53  10:40         0    0.4833         1   
10   31/08/2014  First Yorkshire  53  11:00         0    0.3667       0.7   
11   31/08/2014  First Yorkshire  53  11:20         0    0.5333      1.15   
12   31/08/2014  First Yorkshire  53  14:00         0    0.4833    1.0167   
13   31/08/2014  First Yorkshire  53  16:20         0    0.6833      1.15   
14   31/08/2014  First Yorkshire  53  23:10      None      None      None    
..          ...              ...  ..    ...       ...       ...       ...    
736  25/10/2014  First Yorkshire  53  21:40         0    1.0167       1.3   
737  25/10/2014  First Yorkshire  53  22:40         0    0.5667         1

数据是正确的,它只是已更改的行的排序(这是在SQL Server Management Studio中查看SQL表时确认的)。我在操作之前和之后都检查了输入表,并且它保持不变,因此排序问题必须是在转换为SQL时。

用于创建SQL表的代码是:

engine = sqlalchemy.create_engine("mssql+pyodbc://*server*?driver=SQL+Server+Native+Client+10.0?trusted_connection=yes")
conn = engine.connect()
art_array.to_sql(theartsql, engine, if_exists="replace", index=False)

(实际指定服务器的地方)

可能导致此问题的原因以及如何解决?任何帮助都会非常感激......

编辑:我应该提到我使用的版本是:

Python版本:2.7.8

Pandas版本:0.15.1

SQLalchemy版本:1.0.12

这些都需要保持与其他软件兼容。

2 个答案:

答案 0 :(得分:1)

正常 Sql表不保持行顺序。您需要“按订单”才能获得正确的订单。在将数据移动到SQL之前,可以包含行id(或索引)。那么,你可以在Sql中“排序”。

尝试这样的事情:

df
      a
0  1.00
1  2.00
2  0.67
3  1.34

print df.reset_index().to_sql(xxxx)
   index     a
0      0  1.00
1      1  2.00
2      2  0.67
3      3  1.34

然后在SQL中,您可以“按顺序”索引。“order by”语法可能因SQL数据库而异。

答案 1 :(得分:-2)

对于仍在研究此问题的任何人。我发现使用选项method="multi"可以保留订单。默认情况下,该方法为无,即“使用标准SQL INSERT子句(每行一个)”。通过指定multi方法,它“在单个INSERT子句中传递多个值”。

df.tosql(method="multi")