要求:
DataFrame中的一个特定列是“混合”类型。它可以包含"123456"
或"ABC12345"
等值。
使用xlsxwriter将此数据框写入Excel。
对于像"123456"
这样的值,Pandas将它转换为123456.0
(让它看起来像一个浮点数)
我们需要将它作为123456(即+整数)放入xlsx,以防值为FULLY numeric。
努力:
下面显示的代码段
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 [mask]中)
KeyError:'[102711。1027111027111110271110711111071111107111110711。\ n 10271110711111071111。1027111071111,1027111071111107111110211111071111107111110101071071011111071110107111071011。 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. 21 24. 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.]不在索引'
我是python / pandas的新手,任何帮助,解决方案都非常感谢。
答案 0 :(得分: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
答案 1 :(得分:1)
将apply
和pd.to_numeric
与参数errors='ignore'
考虑pd.Series
s
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
答案 2 :(得分:1)
最后,它使用pandas read_excel格式的'converter'选项作为
df_w02 = pd.read_excel(excel_name, names = df_header,converters = {'AltID':str,'RatingReason' : str}).fillna("")
转换器可以“转换”由我的函数/值定义的类型,并将intefer保存为字符串而不添加小数点。