[英]Improving on pandas tolist() performance
我對200列的熊貓數據框執行以下操作大約需要1s
秒鍾:
for col in mycols:
values = [str(_item) if col_raw_type == 'object' else '{:f}'.format(_item)
for _item in df[col_name].dropna().tolist()
if (_item is not None) and str(_item)]
有沒有更好的方法來做到這一點? 似乎tolist
操作有點慢?
我在這里想要做的是轉換類似:
field field2
'2014-01-01' 1.0000000
'2015-01-01' nan
變成這樣的東西:
values_of_field_1 = ['2014-01-01', '2015-01-01']
values_of_field_2 = [1.00000,]
因此,我可以推斷出列的類型。 例如,我想要的最終產品將是:
type_of_field_1 = DATE # %Y-%m-%d
type_of_field_2 = INTEGER #
似乎您正在嘗試將DataFrame
中的整個Series
列DataFrame
為特定類型。 以該DataFrame
為例:
>>> import pandas as pd
>>> import numpy as np
用混合類型的列創建一個DataFrame:
>>> df = pd.DataFrame({'a': [1, np.nan, 2, 'a', None, 'b'], 'b': [1, 2, 3, 4, 5, 6], 'c': [np.nan, np.nan, 2, 2, 'a', 'a']})
>>> df
a b c
0 1 1 NaN
1 NaN 2 NaN
2 2 3 2
3 a 4 2
4 None 5 a
5 b 6 a
>>> df.dtypes
a object
b int64
c object
dtype: object
>>> for col in df.select_dtypes('object'):
... print(col)
... print('\n'.join('{}: {}'.format(v, type(v)) for v in df[col]))
...
a
1: <class 'int'>
nan: <class 'float'>
2: <class 'int'>
a: <class 'str'>
None: <class 'NoneType'>
b: <class 'str'>
c
nan: <class 'float'>
nan: <class 'float'>
2: <class 'int'>
2: <class 'int'>
a: <class 'str'>
a: <class 'str'>
使用pd.Series.astype
將object
dtype轉換為str
:
>>> for col in df.select_dtypes('object'):
... df[col] = df[col].astype(str)
... print(col)
... print('\n'.join('{}: {}'.format(v, type(v)) for v in df[col]))
...
a
1: <class 'str'>
nan: <class 'str'>
2: <class 'str'>
a: <class 'str'>
None: <class 'str'>
b: <class 'str'>
c
nan: <class 'str'>
nan: <class 'str'>
2: <class 'str'>
2: <class 'str'>
a: <class 'str'>
a: <class 'str'>
如果您認為tolist()使代碼運行緩慢,則可以刪除tolist()。 根本不需要使用tolist()。 下面的代碼將為您提供相同的輸出。
for col in mycols:
values = [str(_item) if col_raw_type == 'object' else '{:f}'.format(_item)
for _item in df[col_name].dropna()
if (_item is not None) and str(_item)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.