如何在SQLite3中修改列?

时间:2018-12-13 17:37:49

标签: python list

我有一个列表A有很多列。 问题是如何根据先前的值替换y列中的值1。

A = [ d   x    y    z
      0   1    2    5
      1   2    1    9
      2   8    1    2
      3   3    40   7
      4   6    1    7
      5   4    30   3
      6   8    40   8
      7   9    1   10
      8   6    1    4
      9  10   10    7]
 The expected answer should be :  
A = [ d   x    y    z
      0   1    2    5
      1   2    2    9
      2   8    2    2
      3   3    40   7
      4   6    40   7
      5   4    30   3
      6   8    40   8
      7   9    40   10
      8   6    40   4
      9  10    10   7]

非常感谢...

这是我的代码,我正在尝试修改y列并将其保存在同一表中。

import csv
import numpy as np
import numpy
import pandas as pd

conn = sqlite3.connect('data.db')
conn.text_factory = str 
cur = conn.cursor()
A = cur.execute("SELECT * FROM table1")


with open('output_data1001.csv', 'w') as f: 
  writer = csv.writer(f)
  writer.writerow(['d', 'x','y','z'])
  writer.writerows(A)

2 个答案:

答案 0 :(得分:1)

这不是列表的格式。Python不会以这种方式读取列表。有两种方法可以做到这一点,但它们都需要以不同的方式考虑列表或将其格式化为列表以外的格式。如果要将其保留为列表,可以将其设置为列表列表:

A = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
    [1, 2, 8, 3, 6, 4, 8, 9, 6, 10], 
    [2, 1, 1, 40, 1, 30, 40, 1, 1, 10], 
    [5, 9, 2, 7, 7, 3, 8, 10, 4, 7]]

现在,您可以按子列表的索引引用子列表,并进行所需的任何更改:

for i in range(len(A[2])):
    if A[2][i]==1:
        A[2][i]=A[2][i-1]

print(A[2])
>>>[2, 2, 2, 40, 40, 30, 40, 40, 40, 10]

您还可以将列表称为数组,而不是列表:

import numpy
A = numpy.array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
                [1, 2, 8, 3, 6, 4, 8, 9, 6, 10], 
                [2, 1, 1, 40, 1, 30, 40, 1, 1, 10], 
                [5, 9, 2, 7, 7, 3, 8, 10, 4, 7]])

for i in range(0,len(A[2])):
    if A[2, i]==1:
        A[2, i]=A[2, i-1]

print(A[2])
>>>[2, 2, 2, 40, 40, 30, 40, 40, 40, 10]

也可以是字典:

A = {"d":[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
    "x":[1, 2, 8, 3, 6, 4, 8, 9, 6, 10], 
    "y":[2, 1, 1, 40, 1, 30, 40, 1, 1, 10], 
    "z":[5, 9, 2, 7, 7, 3, 8, 10, 4, 7]}

for i in range(len(A["y"])):
    if A["y"][i]==1:
        A["y"][i]=A["y"][i-1]

print(A["y"])
>>>[2, 2, 2, 40, 40, 30, 40, 40, 40, 10]

Python的数据结构比其他语言要宽松一些,因此一开始很容易被它们绊倒,因为python可以让您做很多事情,而不必完全了解所使用的数据类型,但是,通常,在尝试以这种方式构造数据之前,应始终考虑数据类型及其背后的语法约定。

答案 1 :(得分:0)

Python列表不是数组。他们没有专栏。不过,您可以创建列表列表,从而可以调用“ A [2] [3]”之类的东西。或者在这种情况下,只需要有一个字典,其中的键是“ d”,“ x”,“ y”和“ z”,它们各自的值是代表每一列的列表。

>>> A = {}
>>> A['d'] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> A['x'] = [1, 2, 8, 3, 6, 4, 8, 9, 6, 10]
>>> A['y'] = [2, 1, 1, 30, 1, 30, 40, 1, 1, 10]
>>> A['z'] = [5, 9, 2, 7, 7, 3, 8, 10, 4, 7]
>>> A['y']
[2, 1, 1, 30, 1, 30, 40, 1, 1, 10]

然后,您可以编写一个循环以从第二个位置开始浏览所有“ y”值,并将任何一个替换为以前的值:

>>> for i in range(1,len(A['y'])):
...     if A['y'][i] == 1:
...             A['y'][i] = A['y'][i-1]
...
>>> A['y']
[2, 2, 2, 30, 30, 30, 40, 40, 40, 10]

编辑:我从您最近的编辑中看到,这根本不是您正在使用的列表,而是Pandas模块中的数据框。同样,“列表”和“数组”表示Python中非常特定的形式。但是相同的逻辑可以起作用:

import pandas as pd

mydict = {'d': pd.Series([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
          'x': pd.Series([1, 2, 8, 3, 6, 4, 8, 9, 6, 10]),
          'y': pd.Series([2, 1, 1, 30, 1, 30, 40, 1, 1, 10]),
          'z': pd.Series([5, 9, 2, 7, 7, 3, 8, 10, 4, 7])}
A = pd.DataFrame(mydict)

for row in range(A.shape[0]):
    if A['y'][row] == 1:
        A['y'][row] = A['y'][row-1]