Pandas更改列型別

2021-10-07 04:15:07 字數 4268 閱讀 8690

複習用

# 單列

pd.to_numeric(df[0]

)# 多列

df[[0,

1]].

(pd.to_numeric)

# 有無效值報錯

df[[0,

1]].

(pd.to_numeric, errors=

'coerce'

)# 無效值轉換成nan

df[[0,

1]].

(pd.to_numeric, errors=

'ignore'

)# 有無效值取消操作

# 轉換為日期和時間戳

pd.to_datetime

pd.to_timedelta

# 自動推斷

df.infer_objects(

)# astype()

df[[0,

1]]= df[[0

,1]]

.astype(

float

)

先看乙個非常簡單的例子:

a =[[

'a',

'1.2'

,'4.2'],

['b'

,'70'

,'0.03'],

['x'

,'5'

,'0']]

df = pd.dataframe(a)

有什麼方法可以將列轉換為適當的型別?例如,上面的例子,如何將列2和3轉為浮點數?有沒有辦法將資料轉換為dataframe格式時指定型別?或者是建立dataframe,然後通過某種方法更改每列的型別?理想情況下,希望以動態的方式做到這一點,因為可以有數百個列,明確指定哪些列是哪種型別太麻煩。可以假定每列都包含相同型別的值。

可以用的方法簡單列舉如下:

對於建立dataframe的情形

如果要建立乙個dataframe,可以直接通過dtype引數指定型別:

df = pd.dataframe(a, dtype=

'float'

)#示例1

df = pd.dataframe(data=d, dtype=np.int8)

#示例2

df = pd.read_csv(

"somefile.csv"

, dtype =

)

對於單列或者series

下面是乙個字串seriess的例子,它的dtype為object:

>>

> s = pd.series(

['1'

,'2'

,'4.7'

,'pandas'

,'10'])

>>

> s01

1224.7

3 pandas410

dtype:

object

使用to_numeric轉為數值。預設情況下,它不能處理字母型的字串』pandas』:

>>

> pd.to_numeric(s)

# or pd.to_numeric(s, errors='raise')

valueerror: unable to parse string

可以將無效值強制轉換為nan,如下所示:

>>

> pd.to_numeric(s, errors=

'coerce')0

1.01

2.02

4.73 nan

410.0

dtype: float64

如果遇到無效值,第三個選項就是忽略該操作:

>>

> pd.to_numeric(s, errors=

'ignore'

)# the original series is returned untouched

對於多列或者整個dataframe

對於某個dataframe:

>>

> a =[[

'a',

'1.2'

,'4.2'],

['b'

,'70'

,'0.03'],

['x'

,'5'

,'0']]

>>

> df = pd.dataframe(a, columns=

['col1'

,'col2'

,'col3'])

>>

> df

col1 col2 col3

0 a 1.2

4.21 b 70

0.03

2 x 5

0

然後可以寫:

df[

['col2'

,'col3']]

= df[

['col2'

,'col3']]

.(pd.to_numeric)

那麼』col2』和』col3』根據需要具有float64型別。

但是,可能不知道哪些列可以可靠地轉換為數字型別。在這種情況下,設定引數:

df.

(pd.to_numeric, errors=

'ignore'

)

然後該函式將被應用於整個dataframe,可以轉換為數字型別的列將被轉換,而不能(例如,它們包含非數字字串或日期)的列將被單獨保留。

另外pd.to_datetimepd.to_timedelta可將資料轉換為日期和時間戳。

軟轉換——型別自動推斷

版本0.21.0引入了infer_objects()方法,用於將具有物件資料型別的dataframe的列轉換為更具體的型別。

例如,用兩列物件型別建立乙個dataframe,其中乙個儲存整數,另乙個儲存整數的字串:

>>

> df = pd.dataframe(

, dtype=

'object'

)>>

> df.dtypes

a object

b object

dtype:

object

然後使用infer_objects(),可以將列』a』的型別更改為int64:

>>

> df = df.infer_objects(

)>>

> df.dtypes

a int64

b object

dtype:

object

由於』b』的值是字串,而不是整數,因此』b』一直保留。

astype強制轉換

如果試圖強制將兩列轉換為整數型別,可以使用df.astype(int)。

示例如下:

a =[[

'a',

'1.2'

,'4.2'],

['b'

,'70'

,'0.03'],

['x'

,'5'

,'0']]

df = pd.dataframe(a, columns=

['one'

,'two'

,'three'])

dfout[16]

: one two three

0 a 1.2

4.21 b 70

0.03

2 x 5

0df.dtypes

out[17]

: one object

two object

three object

df[[

'two'

,'three']]

= df[

['two'

,'three']]

.astype(

float

)df.dtypes

out[19]

: one object

two float64

three float64

change data type of columns in pandas

在Pandas中更改列的資料型別

先看乙個非常簡單的例子 a a 1.2 4.2 b 70 0.03 x 5 0 df pd.dataframe a 有什麼方法可以將列轉換為適當的型別?例如,上面的例子,如何將列2和3轉為浮點數?有沒有辦法將資料轉換為dataframe格式時指定型別?或者是建立dataframe,然後通過某種方法更...

在Pandas中更改列的資料型別 方法總結

先看乙個非常簡單的例子 a a 1.2 4.2 b 70 0.03 x 5 0 df pd.dataframe a 有什麼方法可以將列轉換為適當的型別?例如,上面的例子,如何將列2和3轉為浮點數?有沒有辦法將資料轉換為dataframe格式時指定型別?或者是建立dataframe,然後通過某種方法更...

在Pandas中更改列的資料型別 方法總結

先看乙個非常簡單的例子 a a 1.2 4.2 b 70 0.03 x 5 0 df pd.dataframe a 有什麼方法可以將列轉換為適當的型別?例如,上面的例子,如何將列2和3轉為浮點數?有沒有辦法將資料轉換為dataframe格式時指定型別?或者是建立dataframe,然後通過某種方法更...