![](/img/trans.png)
[英]How to convert a dtype from object to int in Python pandas?
[英]Pandas: convert dtype 'object' to int
我已經閱讀了 SQL 查詢到 Pandas 並且值以 dtype 'object' 的形式出現,盡管它們是字符串、日期和整數。 我能夠將日期“對象”轉換為 Pandas 日期時間 dtype,但是在嘗試轉換字符串和整數時出現錯誤。
這是一個例子:
>>> import pandas as pd
>>> df = pd.read_sql_query('select * from my_table', conn)
>>> df
id date purchase
1 abc1 2016-05-22 1
2 abc2 2016-05-29 0
3 abc3 2016-05-22 2
4 abc4 2016-05-22 0
>>> df.dtypes
id object
date object
purchase object
dtype: object
將df['date']
轉換為日期時間有效:
>>> pd.to_datetime(df['date'])
1 2016-05-22
2 2016-05-29
3 2016-05-22
4 2016-05-22
Name: date, dtype: datetime64[ns]
但是在嘗試將df['purchase']
轉換為 integer 時出現錯誤:
>>> df['purchase'].astype(int)
....
pandas/lib.pyx in pandas.lib.astype_intsafe (pandas/lib.c:16667)()
pandas/src/util.pxd in util.set_value_at (pandas/lib.c:67540)()
TypeError: long() argument must be a string or a number, not 'java.lang.Long'
注意:當我嘗試.astype('float')
時出現類似錯誤
當嘗試轉換為字符串時,似乎什么也沒有發生。
>>> df['id'].apply(str)
1 abc1
2 abc2
3 abc3
4 abc4
Name: id, dtype: object
根據@piRSquared 的評論記錄對我有用的答案。
我需要先轉換為字符串,然后是整數。
>>> df['purchase'].astype(str).astype(int)
convert_dtypes
(自我)接受的答案沒有考慮對象列中 NaN 的可能性。
df = pd.DataFrame({
'a': [1, 2, np.nan],
'b': [True, False, np.nan]}, dtype=object)
df
a b
0 1 True
1 2 False
2 NaN NaN
df['a'].astype(str).astype(int) # raises ValueError
這會令人窒息,因為 NaN 被轉換為字符串“nan”,進一步嘗試強制轉換為整數將失敗。 為了避免這個問題,我們可以使用convert_dtypes
將列軟轉換為其相應的可為空類型:
df.convert_dtypes()
a b
0 1 True
1 2 False
2 <NA> <NA>
df.convert_dtypes().dtypes
a Int64
b boolean
dtype: object
如果您的數據中混有垃圾文本和整數,您可以使用pd.to_numeric
作為初始步驟:
s = pd.Series(['1', '2', '...'])
s.convert_dtypes() # converts to string, which is not what we want
0 1
1 2
2 ...
dtype: string
# coerces non-numeric junk to NaNs
pd.to_numeric(s, errors='coerce')
0 1.0
1 2.0
2 NaN
dtype: float64
# one final `convert_dtypes` call to convert to nullable int
pd.to_numeric(s, errors='coerce').convert_dtypes()
0 1
1 2
2 <NA>
dtype: Int64
很簡單
pd.factorize(df.purchase)[0]
示例:
labels, uniques = pd.factorize(['b', 'b', 'a', 'c', 'b'])`
labels
# array([0, 0, 1, 2, 0])
uniques
# array(['b', 'a', 'c'], dtype=object)
我的訓練數據包含三個特征是對象,在應用astype
它將對象轉換為數字,但在此之前,您需要執行一些預處理步驟:
train.dtypes
C12 object
C13 object
C14 Object
train['C14'] = train.C14.astype(int)
train.dtypes
C12 object
C13 object
C14 int32
請按照以下步驟操作:
1.清理你的文件->以csv
格式打開你的數據文件,看到有“?” 代替空的地方並刪除所有這些。
2.刪除包含缺失值的行,例如:
df.dropna(subset=["normalized-losses"], axis = 0 , inplace= True)
3.現在使用astype進行轉換
df["normalized-losses"]=df["normalized-losses"].astype(int)
注意:如果在你的程序中仍然發現錯誤,那么再次檢查你的csv
文件,在 excel 中打開它以查看是否有“?” 在您需要的列中,然后將其刪除並保存文件並返回並運行您的程序。
評論成功! 如果它有效。 :)
無法發表評論,因此將其作為答案發布,這有點介於@piRSquared / @cyril的解決方案和@cs95的解決方案之間:
正如@cs95 所指出的,如果您的數據包含 NaN 或 Nones,則在之后嘗試轉換為 int 時,轉換為字符串類型將引發錯誤。
但是,如果您的數據組成的(數字)串,用convert_dtypes
將它,除非你使用轉換為字符串類型pd.to_numeric
通過@ cs95的建議(可能與合並df.apply()
如果您的數據僅包含數字字符串(包括 NaN 或 None 但沒有任何非數字“垃圾”),一個可能更簡單的替代方法是先轉換為浮點數,然后轉換為提供的可空整數擴展 dtypes 之一由熊貓(已存在於 0.24 版中)(另請參閱此答案):
df['purchase'].astype(float).astype('Int64')
請注意,最近在github上對此進行了討論(盡管目前是一個未解決的已關閉問題),並且在非常長的 64 位整數的情況下,您可能必須顯式轉換為float128
以避免在轉換過程中出現近似值。
df['col_name'] = pd.to_numeric(df['col_name'])
這是一個更好的選擇
就我而言,我有一個混合數據的 df:
df:
0 1 2 ... 242 243 244
0 2020-04-22T04:00:00Z 0 0 ... 3,094,409.5 13,220,425.7 5,449,201.1
1 2020-04-22T06:00:00Z 0 0 ... 3,716,941.5 8,452,012.9 6,541,599.9
....
花車實際上是物體,但我需要它們是真正的花車。
要修復它,請參考上面@AMC 的評論:
def coerce_to_float(val):
try:
return float(val)
except ValueError:
return val
df = df.applymap(lambda x: coerce_to_float(x))
要更改數據類型並將其保存到數據框中,需要按如下方式替換新的數據類型:
ds["cat"] = pd.to_numeric(ds["cat"]) 或 ds["cat"] = ds["cat"].astype(int)
如果這些方法都失敗了,你可以嘗試像這樣的列表理解:
df["int_column"] = [int(x) if x.isnumeric() else x for x in df["str_column"] ]
使用 astype 函數轉換該列的數據類型
我對編程語言非常陌生。...開始了AIML課程。.現在在這里,我有一個項目要完成,這是我課程的一部分..這是我受困的地方..任何人都可以建議我一些繼續我的技巧項目..
我的疑問:
我的數據集中有一些分類列:Sex,Region,Smoker現在將它們轉換為整數形式,當我打印了isull()時,我使用cat_df []。value_counts()來輸出顯示空值的情況。 當給了cat_df []。head()時,它給出了該類別中的前五行。但是當給了barplot或distplot時,它給出了一個錯誤
我的道歉:類別列是否更改為整數...如果沒有,當我給print(df []。value_counts()時為什么顯示dtype:int64?
任何人都可以提出解決方案...
在此先感謝..拉米婭。
## list of columns
l1 = ['PM2.5', 'PM10', 'TEMP', 'BP', ' RH', 'WS','CO', 'O3', 'Nox', 'SO2']
for i in l1:
for j in range(0, 8431): #rows = 8431
df[i][j] = int(df[i][j])
我建議你只對小數據使用它。 這段代碼的復雜度為 O(n^2)。
將 object 轉換為數字int
或float
。
代碼是:--
df["total_sqft"] = pd.to_numeric(df["total_sqft"], errors='coerce').fillna(0, downcast='infer')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.