Как изменить столбец в SQLite3? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть список А, имеющий много столбцов.Вопрос в том, как заменить значение 1 в столбце y на основе предыдущего значения.

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 и сохранить его в той же таблице1.

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 голосов
/ 13 декабря 2018

Это не тот формат, в котором находится ваш список. 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 позволит вам много делать, не зная полностью, какой тип данных вы используете, но, в общем, вы всегда должны учитывать свои данныевведите и синтаксические соглашения, стоящие за ним, прежде чем пытаться структурировать ваши данные таким образом.

0 голосов
/ 13 декабря 2018

Списки 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...