簡體   English   中英

Pandas:將 dtype 'object' 轉換為 int

[英]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)

熊貓 >= 1.0

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 轉換為數字intfloat

代碼是:--

df["total_sqft"] = pd.to_numeric(df["total_sqft"], errors='coerce').fillna(0, downcast='infer')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM