Скрипт Pandas работает на компьютере, а не на защищенном сервере («KeyError»)? - PullRequest
0 голосов
/ 28 августа 2018

Я получил файл .xlsx от «заказчика», который мне нужно проанализировать определенным образом, чтобы получить информацию в базу данных MySQL.

Написанный мною скрипт Python (Pandas) работает как чудо на моем собственном компьютере - но как только я переношу сценарий на защищенный сервер, где должен произойти настоящий синтаксический анализ, он возвращает сообщение «KeyError».

Я прошел через многочисленные посты о «KeyError» в скриптах Pandas, но не нашел решения, которое работает.

Поэтому я надеюсь, что некоторые из вас могут распознать эту проблему и найти решение, которое будет работать?

Полученный мной тестовый файл xlsx выглядит так (да, есть раздражающие пробелы и т. Д., И они хотят сохранить его таким):

'Rack Position', 'STUDY ID', 'Freeze-thaw cycles', 'New Rack Position', 'Project code'
A1, 92, 1, B2, '1,4'
A2, 93, 0, B3, 1
A3, 94, 1, B4, 1

Это файл Excel, поэтому кавычек вокруг имен нет. Я просто добавил их, чтобы сделать их более читабельными.

«Заказчик» хочет следующий формат с дополнительной информацией о таблице:

studyid,count,field,value,table
92, 1, 'Rack Position', A1, table1
92, 1, 'New Rack Position', B2, table1
92, 1, 'Project code', 1
92, 1, 'Project code', 2
93, 0,  'Rack Position, 1
... and so on

Я написал этот скрипт, который отлично работает на моем собственном компьютере:

import pandas as pd

# reading in the file (excel converted to csv, semicolon delimited to avoid errors with the "Project code" column)
df = pd.read_excel(/home/data/test.xlsx, sheet_name='ALL BOXES')

# rename STUDY ID to studyid and Freeze-thaw cycles to count
df = df.rename(columns={'STUDY ID': 'studyid', 'Freeze-thaw cycles': 'count'})

# splitting "Project code" based on comma into two columns (Project code1 and Project code2) -if more comma seperated
# values, this need to be changed to more columns
df = df.join(df['Project code'].str.split(',', 1, expand=True).rename(columns={0:'Project code1', 1:'Project code2'}))

# remove the now excessive "Project code" from the table
df = df.drop('Project code', 1)

# Split the dataframe based on Project code1 and Project code2
df1 = df[['Rack position', 'studyid', 'count', 'New Rack Position', 'Project code1']]
df2 = df[['Rack position', 'studyid', 'count', 'New Rack Position', 'Project code2']]

# rename Project code1 and Project code2 to Project code
df1 = df1.rename(columns={'Project code1': 'Project code'})
df2 = df2.rename(columns={'Project code2': 'Project code'})

# concatenate the dataframes based on "Project code"
df = pd.concat([df1, df2], axis=0)

# remove Project code = 0
df = df[df['Project code'].notnull()]

# convert the data frame into the long format
df = pd.melt(df, id_vars=['studyid', 'count'], var_name='field', value_name='value')

# Change all NaNs to None
df = df.where((pd.notnull(df)), None)

# creating new column with MySql table name
table = []
df['table'] = 'table1'

#save to file:
df.to_csv('filename.csv', encoding='utf-8')

Но на безопасном сервере он возвращает следующую ошибку:

Traceback (most recent call last):
File "/home/data/sample.py", line 17, in <module>
df = df.join(df['Project code'].str.split(',', 1, expand=True).rename(columns={0:'Project code1', 1:'Project code2'}))
File: "/tools/anaconda2/4.4.0/lib/python2.7/site-packages/pandas/core/frame.py, line 2688, in _getitem_
return self._getitem_column(key)
File: "/tools/anaconda2/4.4.0/lib/python2.7/site-packages/pandas/core/frame.py, line 2695, in _getitem_column
return self._getitem_cache(key)
File: "/tools/anaconda2/4.4.0/lib/python2.7/site-packages/pandas/core/generic.py, line 2489, in _getitem_cache
values = self._data.get(item)
File: "/tools/anaconda2/4.4.0/lib/python2.7/site-packages/pandas/core/internals.py, line 4115, in get
loc = self.items.get_loc(item)
File: "/tools/anaconda2/4.4.0/lib/python2.7/site-packages/pandas/core/base.py, line 3080, in get_loc
return self._engine.get_loc(self._maybe_cast_indexer(key))
File: "pandas/_libs/index.pyx", line 140, in pandas._libs.index.IndexEngine.get_loc
File: "pandas/_libs/index.pyx", line 162, in pandas._libs.index.IndexEngine.get_loc
File: "pandas/_libs/hashtable_class_helper.pxi", line 1492, in pandas._libs.hashtable.PyObjectHashTable.get_item
File: "pandas/_libs/hashtable_class_helper.pxi", line 1500, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 'Project code'

На сервере скрипт запускается через python2.7 в модуле anaconda (4.4.0). На моем компьютере скрипт был написан и протестирован в PyCharm (2018.2.2) с python2.7 (pandas ver. 0.23.4 и anaconda ver. 0.0.1.1).

...