2016-09-21 8 views
3

Требование:Ошибка Pandas при преобразовании строки в целое число

Один конкретный столбец в DataFrame является «смешанным» типом. Он может иметь такие значения, как "123456" или "ABC12345".

Этот dataframe записывается в Excel с использованием xlsxwriter.

Для значений, как "123456", вниз по линии Панды превращения его в 123456.0 (делая его похожим на поплавок)

Нам нужно поместить его в XLSX в качестве 123456 (то есть как + целое число) в случае, если значение ПОЛНОСТЬЮ числовой ,

усилию:

фрагмент кода, приведенный ниже

import pandas as pd 
import numpy as np 
import xlsxwriter 
import os 
import datetime 
import sys 
excel_name = str(input("Please Enter Spreadsheet Name :\n").strip()) 

print("excel entered : " , excel_name) 
df_header = ['DisplayName','StoreLanguage','Territory','WorkType','EntryType','TitleInternalAlias', 
     'TitleDisplayUnlimited','LocalizationType','LicenseType','LicenseRightsDescription', 
     'FormatProfile','Start','End','PriceType','PriceValue','SRP','Description', 
     'OtherTerms','OtherInstructions','ContentID','ProductID','EncodeID','AvailID', 
     'Metadata', 'AltID', 'SuppressionLiftDate','SpecialPreOrderFulfillDate','ReleaseYear','ReleaseHistoryOriginal','ReleaseHistoryPhysicalHV', 
      'ExceptionFlag','RatingSystem','RatingValue','RatingReason','RentalDuration','WatchDuration','CaptionIncluded','CaptionExemption','Any','ContractID', 
      'ServiceProvider','TotalRunTime','HoldbackLanguage','HoldbackExclusionLanguage'] 
first_pass_drop_duplicate = df_m_d.drop_duplicates(['StoreLanguage','Territory','TitleInternalAlias','LocalizationType','LicenseType', 
            'LicenseRightsDescription','FormatProfile','Start','End','PriceType','PriceValue','ContentID','ProductID', 
            'AltID','ReleaseHistoryPhysicalHV','RatingSystem','RatingValue','CaptionIncluded'], keep=False) 
# We need to keep integer AltID as is 

first_pass_drop_duplicate.loc[first_pass_drop_duplicate['AltID']] = first_pass_drop_duplicate['AltID'].apply(lambda x : str(int(x)) if str(x).isdigit() == True else x) 

Я попытался:

1. using `dataframe.astype(int).astype(str)` # works as long as value is not alphanumeric 
2.importing re and using pure python `re.compile()` and `replace()` -- does not work 
3.reading DF row by row in a for loop !!! Kills the machine as dataframe can have 300k+ records 

Каждый раз, Я получаю ошибку:

raise KeyError('%s not in index' % objarr[mask])
KeyError: '[ 102711. 102711. 102711. 102711. 102711. 102711. 102711. 102711.\n 102711. 102711. 102711. 102711. 102711. 102711. 102711. 102711.\n 102711. 102711. 102711. 102711. 102711. 102711. 102711. 102711.\n 102711. 102711. 102711. 102711. 102711. 102711. 102711. 102711.\n 102711. 102711. 102711. 102711. 102711. 102711. 102711. 102711.\n 102711. 102711. 102711. 102711. 102711. 102711. 102711. 102711.\n 102711. 102711. 102711. 102711. 102711. 102711. 102711. 102711.\n 102711. 102711. 102711. 102711. 102711. 102711. 102711. 102711.\n 5337. 5337. 5337. 5337. 5337. 5337. 5337. 5337.\n 5337. 5337. 5337. 5337. 5337. 5337. 5337. 5337.\n 5337. 5337. 5337. 5337. 5337. 5337. 5337. 5337.\n 5337. 5337. 5337. 5337. 5337. 5337. 5337. 5337.\n 5337. 5337. 5337. 5337. 5337. 5337. 5337. 5337.\n 5337. 5337. 2124. 2124. 2124. 2124. 2124. 2124.\n 2124. 2124. 6643. 6643. 6643. 6643. 6643. 6643.\n 6643. 6643. 6643. 6643. 6643. 6643. 6643. 6643.\n 6643. 6643. 6643. 6643. 6643. 6643. 6643. 6643.\n 6643. 6643. 6643. 6643. 6643. 6643. 6643. 6643.] not in index'

Я новичок в python/pandas, любая помощь , решение очень ценится.

+0

Итак, вам нужно преобразовать только числовые значения в 'float' и не numeric not? – jezrael

+0

Мне нужно убедиться, что он обрабатывает целое число + TEXT/STRING и не добавляет в конец .0 (десятичная точка), который фактически отображается в excel. – SanBan

+0

Итак, вам нужно преобразовать все значения в 'type'' string'? и проблема заключается в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' преобразования', преобразованных в 'string' как' float'? – jezrael

ответ

2

Я думаю, что вам нужно to_numeric:

df = pd.DataFrame({'AltID':['123456','ABC12345','123456'], 
        'B':[4,5,6]}) 

print (df) 
     AltID B 
0 123456 4 
1 ABC12345 5 
2 123456 6 

df.ix[df.AltID.str.isdigit(), 'AltID'] = pd.to_numeric(df.AltID, errors='coerce') 

print (df) 
     AltID B 
0 123456 4 
1 ABC12345 5 
2 123456 6 

print (df['AltID'].apply(type)) 
0 <class 'float'> 
1  <class 'str'> 
2 <class 'float'> 
Name: AltID, dtype: object 
+0

Это великолепно! Это не сработало для моей серии, потому что 4-й элемент уже был 'int'. 'pd.Series ([1], dtype = object) .str.isdigit()' возвращает 'NaN'. Я должен был сделать это: 's.ix [s.str.isdigit(). Fillna (False)] = pd.to_numeric (s, errors = 'coerce')', и он отлично работал. – piRSquared

+0

И! Это почти наверняка быстрее. – piRSquared

+0

@piRSquared - спасибо. Другим решением является 'df.ix [df.AltID.astype (str) .str.isdigit(), 'AltID'] = pd.to_numeric (df.AltID, errors = 'coerce')' – jezrael

1

apply Использование и pd.to_numeric с параметром errors='ignore'

считают pd.Seriess

s = pd.Series(['12345', 'abc12', '456', '65hg', 54, '12-31-2001']) 

s.apply(pd.to_numeric, errors='ignore') 

0   12345 
1   abc12 
2   456 
3   65hg 
4   54 
5 12-31-2001 
dtype: object 

Уведомление о Типы

s.apply(pd.to_numeric, errors='ignore').apply(type) 

0 <type 'numpy.int64'> 
1   <type 'str'> 
2 <type 'numpy.int64'> 
3   <type 'str'> 
4   <type 'int'> 
5   <type 'str'> 
dtype: object 
1

Наконец он работал с помощью опции 'переработчиков в панд read_excel формат,

df_w02 = pd.read_excel(excel_name, names = df_header,converters = {'AltID':str,'RatingReason' : str}).fillna("") 

преобразователи могут «отбрасывать» типа, как это определено моей функции/значение и сохраняет intefer хранится в виде строки без добавив десятичную точку.

Смежные вопросы