我正在尝试将csv文件读入Pandas数据帧,并使用pandas.to_sql函数将最终数据帧插入到Mysql中。
所有列都插入了正确的数据,但数据框中的一列除外,其长度为25个字符。这个列(transaction_id)在MYSQL中被定义为INT(25),我无法弄清楚为什么这个列有错误的数据。
奇怪的是,MySQL中的transaction_id列对于每个csv文件超过360K行具有相同的值。
任何帮助都会很棒。
客户端事务ID示例:
format: transaction id_page id-banner id
2343213254646775357496618_12-586542237
2343213254646775357881218_14-586542237
2343213254646775357886268_10-586542237
2343213254646775357886218_27-586542237
2343213254646775357886248_10-586542237
这是我的代码:
xls = pd.ExcelFile(path_value)
df = xls.parse('report', skiprows=13, index_col=None, na_values=['NA'])
# remove last row
df = df[:-1]
df['transaction_datetime'] = pd.to_datetime(df['transaction_datetime'])
# add transaction date column to data frame:
df['transaction_date'] = df['transaction_datetime'].dt.date
df.loc[:, 'created_date'] = datetime.datetime.now()
# convert client transaction id into three parts
df['transaction_id'], df['placeholder'] = zip(
*df['Client Transaction ID'].apply(lambda x: x.split('_', 1)))
df['page_id'], df['banner_id'] = zip(*df['placeholder'].apply(lambda x: x.split('-', 1)))
df.drop('placeholder', axis=1, inplace=True)
df.drop('Client Transaction ID', axis=1, inplace=True)
print datetime.datetime.now()
# connect to mysql
engine = create_engine(
'connection string'
echo=False)
df.to_sql(name='table', con=engine, if_exists='append', index=False)
print datetime.datetime.now()
答案 0 :(得分:0)
如果我正确理解了您的代码,您可以使用向量化.str.extract()方法解析transaction_id
,page_id
,banner_id
并“一次性”执行此操作:
In [32]: df
Out[32]:
Client Transaction ID
0 tx0001_page01-banner01
1 tx0002_page01-banner23
2 tx0003_page33-banner56
3 tx0004_page12-banner76
4 tx0005_page44-banner11
In [33]: df[['transaction_id','page_id','banner_id']] = \
...: df.pop('Client Transaction ID').str.extract(r'^([^_]*)_([^-]*)-(.*)',
...: expand=True)
...:
In [34]: df
Out[34]:
transaction_id page_id banner_id
0 tx0001 page01 banner01
1 tx0002 page01 banner23
2 tx0003 page33 banner56
3 tx0004 page12 banner76
4 tx0005 page44 banner11
PS你没有提供任何样本数据,所以我不得不用你的代码重建它......
答案 1 :(得分:0)
显然,问题源于MySQL。我的交易ID,长度为25,对于BIGINT来说很重要。我必须将其转换为VARCHAR(25)才能在表中获得正确的值。感谢@MaxU改进我的代码。