2016-11-06 17 views
1

我想讀取一個csv文件到Pandas數據框中,並使用pandas.to_sql函數將最終數據框插入到Mysql中。python熊貓dataframe to_sql將對象轉換爲Mys INT INT數據類型產生不正確的結果

所有列都插入正確的數據,除了長度爲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

您能否提供可重現的樣本數據集(CSV格式爲3-5行)併發布您的代碼? – MaxU

回答

0

如果我理解你的代碼正確,您可以使用矢量.str.extract()方法和做解析transaction_idpage_idbanner_id「 in one shot「:

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你沒有提供任何樣本數據,所以我不得不通過你的代碼重構它...

+0

謝謝MaxU,對不起,我在上傳樣本時丟失了互聯網連接。您的解決方案無疑有助於改進代碼,但在實施解決方案後,我仍在所有行中獲得相同的事務ID。 – peaceSTSW

0

顯然,問題源於MySQL。我的交易ID長度爲25,對BIGINT來說很重要。我必須將其轉換爲VARCHAR(25)才能在表中獲得正確的值。感謝@MaxU提高我的代碼。

相關問題