series處理 - string to dataframe python




更改Pandas中列的數據類型 (4)

如何創建兩個數據框,每個數據框的列都有不同的數據類型,然後將它們附加在一起?

d1 = pd.DataFrame(columns=[ 'float_column' ], dtype=float)
d1 = d1.append(pd.DataFrame(columns=[ 'string_column' ], dtype=str))

結果

In[8}:  d1.dtypes
Out[8]: 
float_column     float64
string_column     object
dtype: object

在創建數據框之後,可以在第1列中填充浮點變量,在第2列中填充字符串(或任何您想要的數據類型)。

我想將一個表格(表示為列表清單)轉換為Pandas DataFrame。 作為一個非常簡單的例子:

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a)

將列轉換為適當類型的最佳方式是什麼?在這種情況下,第2列和第3列轉換為浮點型? 有沒有辦法在轉換為DataFrame時指定類型? 或者先創建DataFrame然後循環遍歷列來更改每列的類型會更好嗎? 理想情況下,我希望以動態的方式進行此操作,因為可能有數百個列,而且我不想明確指定哪些列是哪種類型。 我只能保證每列都包含相同類型的值。


您可以使用pd.to_numeric (在版本0.17中引入)將列或系列轉換為數字類型。 該函數也可以應用在DataFrame的多列上。

重要的是,該函數還會帶有一個errors關鍵字參數,它允許您強制非數值為NaN ,或者簡單地忽略包含這些值的列。

示例使用如下所示。

個別專欄/系列

以下是使用具有對象dtype的一系列字符串s的示例:

>>> s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
>>> s
0         1
1         2
2       4.7
3    pandas
4        10
dtype: object

該函數的默認行為是在不能轉換值時引發。 在這種情況下,它不能應付字符串'熊貓':

>>> 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.0
1     2.0
2     4.7
3     NaN
4    10.0
dtype: float64

第三個選項只是在遇到無效值時忽略該操作:

>>> pd.to_numeric(s, errors='ignore')
# the original Series is returned untouched

多列/整個數據幀

我們可能希望將此操作應用於多個列。 依次處理每一列是很枯燥的,所以我們可以使用DataFrame.apply來讓這個函數對每一列起作用。

從問題中藉用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.2
1    b   70  0.03
2    x    5     0

然後我們可以寫:

df[['col2','col3']] = df[['col2','col3']].apply(pd.to_numeric)

現在'col2'和'col3'根據需要具有dtype float64

但是,我們可能不知道我們的哪些列可以可靠地轉換為數字類型。 在這種情況下,我們可以寫出:

df.apply(pd.to_numeric, errors='ignore')

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

還有pd.to_datetimepd.to_timedelta用於轉換為日期和時間戳。

軟轉換

版本0.21.0引入了用於將具有對像數據類型的DataFrame的列轉換為更具體類型的方法infer_objects()

例如,我們創建一個DataFrame,其中包含兩列對像類型,一列保存整數,另一列保存整數字符串:

>>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, 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'一直保留。 如果我們試圖強制將兩列轉換為整數類型,我們可以使用df.astype(int)來代替。


這個怎麼樣?

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
df
Out[16]: 
  one  two three
0   a  1.2   4.2
1   b   70  0.03
2   x    5     0

df.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

這是一個函數,它將DataFrame和列的列表作為參數,並將列中的所有數據強制轉換為數字。

# df is the DataFrame, and column_list is a list of columns as strings (e.g ["col1","col2","col3"])
# dependencies: pandas

def coerce_df_columns_to_numeric(df, column_list):
    df[column_list] = df[column_list].apply(pd.to_numeric, errors='coerce')

所以,舉個例子:

import pandas as pd

def coerce_df_columns_to_numeric(df, column_list):
    df[column_list] = df[column_list].apply(pd.to_numeric, errors='coerce')

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['col1','col2','col3'])

coerce_df_columns_to_numeric(df, ['col2','col3'])




casting