我使用 Lambda 函式從 s3 讀取 csv 并將資料插入表中。從 s3 讀取時,我注意到當我將它讀到磁盤并在 Pandas 中讀取它時,任何以 int 和 a 開頭的欄位0都變成了浮點數,并且任何前導0都被洗掉了。從 s3 存盤桶讀取時如何將 int 值保留為 int?
例如,如果我有一個欄位account_number,012345678當我從 s3 讀入時,它會變成1234567.0,將我的整數變為Float64. 這會導致下游問題。我如何解決這個問題。
示例代碼:
export_csv = client.get_object(Bucket = s3_bucket, Key = bo_file_name)
bo_body = export_csv['Body']
csv_string = bo_body.read().decode('utf-8')
bo_df = pd.read_csv(StringIO(csv_string), sep = '|', quotechar = '"')
#Replacing NaN values with Nulls.
print('removing nulls from df')
bo_df.fillna('', inplace = True)
sql_server = os.getenv('DB_ENDPOINT')
讀入后的示例架構pandas:
first_name object
middle_initial object
last_name object
date_of_birth object
actnum float64
uj5u.com熱心網友回復:
這里的問題是您的帳戶“數字”實際上是一個恰好全是數字的字串(如果有道理的話)——它沒有數學意義,但 Pandas 認為它??有,所以它把它當作一個浮點數。
解決方案是告訴 Pandas 使用哪種資料型別,以覆寫其(通常)推斷它的良好意圖。
這是一個可重現的演練:
import pandas as pd
data = ["01", "02", "03", "10", "11", "", None]
someDF = pd.DataFrame(data)
someDF.to_csv("accts.csv", index=False)
現在再讀一遍:
pd.read_csv("accts.csv")
你得到這個:
0
0 1.0
1 2.0
2 3.0
3 10.0
4 11.0
5 NaN
6 NaN
不是你想的那樣。
現在通過明確指定資料型別來嘗試:
importedDF = pd.read_csv("accts.csv", names=["Account"], header=0, dtype=str).fillna(value="")
print(importedDF)
Account
0 01
1 02
2 03
3 10
4 11
5
6
筆記:
- 這里有一些關于空值自動轉換為浮點數的整數列問題背景的好資訊:https : //pandas.pydata.org/pandas-docs/stable/user_guide/integer_na.html
- 如果您傳入列名和資料型別的字典,您可以選擇控制資料型別的列 - 詳細資訊在這里:https : //pandas.pydata.org/docs/reference/api/pandas.read_csv.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/374066.html
標籤:Python 熊猫 亚马逊-s3 aws-lambda
