python pandas dataframe to_sql将对象转换为Mysql INT数据类型会产生不正确的结果

时间:2016-11-06 21:25:33

标签: python mysql pandas dataframe

我正在尝试将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()

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的代码,您可以使用向量化.str.extract()方法解析transaction_idpage_idbanner_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改进我的代码。