Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何强制pandas read_csv对所有浮点列使用float32?_Python_Numpy_Pandas - Fatal编程技术网

Python 如何强制pandas read_csv对所有浮点列使用float32?

Python 如何强制pandas read_csv对所有浮点列使用float32?,python,numpy,pandas,Python,Numpy,Pandas,因为 我不需要双重精度 我的机器内存有限,我想处理更大的数据集 我需要将提取的数据(作为矩阵)传递给BLAS库,BLAS对单精度的调用比双精度的调用快2倍 请注意,并非原始csv文件中的所有列都具有浮点类型。我只需要将float32设置为浮点列的默认值。试试: import numpy as np import pandas as pd # Sample 100 rows of data to determine dtypes. df_test = pd.read_csv(filename

因为

  • 我不需要双重精度
  • 我的机器内存有限,我想处理更大的数据集
  • 我需要将提取的数据(作为矩阵)传递给BLAS库,BLAS对单精度的调用比双精度的调用快2倍
请注意,并非原始csv文件中的所有列都具有浮点类型。我只需要将float32设置为浮点列的默认值。

试试:

import numpy as np
import pandas as pd

# Sample 100 rows of data to determine dtypes.
df_test = pd.read_csv(filename, nrows=100)

float_cols = [c for c in df_test if df_test[c].dtype == "float64"]
float32_cols = {c: np.float32 for c in float_cols}

df = pd.read_csv(filename, engine='c', dtype=float32_cols)
首先读取100行数据的样本(根据需要修改),以确定每列的类型

它创建一个“float64”列的列表,然后使用字典理解创建一个字典,其中这些列作为键,“np.float32”作为每个键的值

最后,它使用“c”引擎读取整个文件(为列指定数据类型所需),然后将float32\u cols字典作为参数传递给数据类型

df = pd.read_csv(filename, nrows=100)
>>> df
   int_col  float1 string_col  float2
0        1     1.2          a     2.2
1        2     1.3          b     3.3
2        3     1.4          c     4.4

>>> df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 3 entries, 0 to 2
Data columns (total 4 columns):
int_col       3 non-null int64
float1        3 non-null float64
string_col    3 non-null object
float2        3 non-null float64
dtypes: float64(2), int64(1), object(1)

df32 = pd.read_csv(filename, engine='c', dtype={c: np.float32 for c in float_cols})
>>> df32.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 3 entries, 0 to 2
Data columns (total 4 columns):
int_col       3 non-null int64
float1        3 non-null float32
string_col    3 non-null object
float2        3 non-null float32
dtypes: float32(2), int64(1), object(1)
df=pd.read\u csv(文件名,nrows=100)
>>>df
整数列浮点1字符串列浮点2
0 1 1.2 a 2.2
1 2 1.3 b 3.3
2 3 1.4 c 4.4
>>>df.info()
INT64索引:3个条目,0到2
数据列(共4列):
整数列3非空整数64
float1 3非空float64
字符串\u col 3非空对象
float2 3非空float64
数据类型:float64(2)、int64(1)、object(1)
df32=pd.read\u csv(文件名,engine='c',dtype={c:np.float32表示float\u cols}中的c)
>>>df32.info()
INT64索引:3个条目,0到2
数据列(共4列):
整数列3非空整数64
float1 3非空float32
字符串\u col 3非空对象
float2 3非空float32
数据类型:float32(2)、int64(1)、object(1)

@Alexander's是一个很好的答案。有些列可能需要精确。如果是这样,您可能需要在列表理解中添加更多条件以排除某些列。
any
all
内置功能非常方便:

float_cols=[c代表df_测试中的c如果全部([df_测试[c]),dtype==“float64”,
非测向测试[c]。名称==“纬度”,非测向测试[c]。名称==“经度”])]

如果您不关心列顺序,还有一种方法可以避免
读取\u csv
两次:

将熊猫作为pd导入
df=pd.read\u csv(“file.csv”)
df_float=df.选择数据类型(include=float).astype(“float32”)
df_not_float=df。选择数据类型(排除=float)
df=df_float.join(df_not_float)
或者,如果要将所有非字符串列(例如整数列)转换为浮点:

将熊猫作为pd导入
df=pd.read\u csv(“file.csv”)
df_not_str=df。选择数据类型(排除=对象)。astype(“float32”)
df_str=df.选择类型(include=object)
df=df_not_str.join(df_str)

这里有一个解决方案,它不依赖于
。join
或不需要读取文件两次:

float64_cols = df.select_dtypes(include='float64').columns
mapper = {col_name: np.float32 for col_name in float64_cols}
df = df.astype(mapper)
或将踢腿作为一个衬垫:

df = df.astype({c: np.float32 for c in df.select_dtypes(include='float64').columns})