Pu sh данных в Google лист с датафреймов - PullRequest
2 голосов
/ 21 января 2020

Я пытаюсь поместить данные sh в свой лист google с помощью следующего кода, как я могу изменить код, чтобы он печатался во 2-й строке в правильной базе столбцов созданного заголовка ,

Первый код:

class Header:
  def __init__(self):
    self.No_DOB_Y=1
    self.No_DOB_M=2
    self.No_DOB_D=3
    self.Paid_too_much_little=4
    self.No_number_of_ins=5
    self.No_gender=6
    self.No_first_login=7
    self.No_last_login=8
    self.Too_young_old=9
  def __repr__(self):
    return str(self.__dict__)

  def add_col(self,name):
    setattr(self,name,max(anomali_header.__dict__.values())+1)


anomali_header=Header() 

2-я часть кода (NEW):

# No_gender
a = list(df.loc[df['gender'].isnull()]['id'])
#print(a)

cells=sh3.range(1,1,len(a),1)
for i,cell in enumerate(cells):
  cell.value=a[i]

sh3.update_cells(cells)

В данный момент он обновляется в ячейку A1 ....

enter image description here

Это то, что я, по сути, хочу

enter image description here

Как вы можете видеть код записывает результаты в первую доступную ячейку, которая является A1, по сути, я хочу, чтобы она отображалась внизу моего anomali_header «No_gender», но я не уверен, как связать мою первую часть кода со второй частью кода ...

Благодаря v25, приведенный ниже код работает, но вместо того, чтобы проходить код один за другим, я хотел создать al oop, который проходит через все функции

Я пытаюсь запустить приведенный ниже код, но кажется, что я получаю сообщение об ошибке при использовании l oop.

Ошибка:

TypeError: 'list' object cannot be interpreted as an integer

Код:

# No_DOB_Y
a = list(df.loc[df['Year'].isnull()]['id'])

# No number of ins
b = list(df.loc[df['number of ins'].isnull()]['id'])

# No_gender
c = list(df.loc[df['gender'].isnull()]['id'])

# Updating anomalies to sheet
 condition = [a,b,c]
 column = [1,2,3]

for j in range(column,condition):
   cells=sh3.range(2,column,len(condition)+1,column)
   for i,cell in enumerate(cells):
     cell.value=condition[i]
print('end of check')

sh3.update_cells(cells)

1 Ответ

2 голосов
/ 22 января 2020

Вам нужно изменить параметры range () :

first_row (int) – Row number

first_col (int) – Row number

last_row (int) – Row number

last_col (int) – Row number

Так что-то вроде:

cells=sh3.range(2, 6, len(a)+1, 6)

Или вы могли бы выдать диапазон в виде строки:

cells=sh3.range('F2:F' + str(len(a)+1))

Эти числа могут быть не идеальными, но это должно изменить положение. Возможно, вам придется немного подправить цифры;)


ОБНОВЛЕНИЕ :

Я обнаружил ошибку, используя al oop, обновил мой оригинальный пост TypeError: 'list' object cannot be interpreted as an integer

Это радует, потому что функция range, которую вы используете в for для l oop (не путать с sh3.range, которая вообще является другой функцией), ожидает целые числа, но вы передаете их списки.

Однако, более простой способ реализовать это - создать список кортежей, которые сопоставляют строки с целыми числами столбцов, тогда l oop на основе этого. Что-то вроде:

col_map = [ ('Year', 1),
      ('number of ins', 5),
      ('gender', 6)
    ]

for col_tup in col_map:
    df_list = list(df.loc[df[col_tup[0]].isnull()]['id'])

    cells = sh3.range(2, col_tup[1], len(df_list)+1, col_tup[1])

    for i, cell in enumerate(cells)
        cell.value=df_list[i]

    sh3.update_cells(cells)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...