Ошибка панд при попытке преобразовать строку в целое число

Требование:

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

Этот фрейм данных записывается в 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

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

поднять KeyError('%s не в индексе' % objarr[маска])
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. 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. 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, любая помощь, решение высоко ценится.

3 ответа

Я думаю тебе нужно 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

Использование 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

Наконец, он работал, используя опцию "конвертеры" в формате read_excel для панд в виде

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

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

Другие вопросы по тегам