python - 根据 pandas 中的列索引在 csv 文件导入期间定义数据类型

标签 python pandas csv type-conversion

我需要导入一个包含 300 多列的 csv 文件,在这些列中,只有第一列需要指定为类别,而其余列应为 float 32 或更少。我猜我可以通过列索引指定列的数据类型。我的问题是:根据列索引指定数据类型的最佳方法是什么?

Col_A   Col_B   Col_C   Col_D
001       1       2      1.2
002       2       3      3.5
003       3       4.5      7
004       4       6.5     10

我尝试过的代码是:

df = pd.read_csv(path, low_memory=False,  
             dtype={'Col_A': 'category', [2:]: np.float32)}

最佳答案

有两种情况:

  1. 您知道并因此可以提前指定每列的最佳类型;或
  2. 您事先并不知道最佳类型,因此必须在读取文件后转换为最佳类型。

提前指定

这是一个简单的例子。使用字典:

type_dict = {'Col_A': 'category', 'Col_B': 'int16',
             'Col_C': 'float16', 'Col_D': 'float32'}

df = pd.read_csv(myfile, delim_whitespace=True, dtype=type_dict)

如果您事先不知道列名称,只需阅读列作为初始步骤:

cols = pd.read_csv(myfile, delim_whitespace=True, nrows=0).columns
# Index(['Col_A', 'Col_B', 'Col_C', 'Col_D'], dtype='object')

type_dict = {'Col_A': 'category', **{col: 'float32' for col in cols[1:]}}

df = pd.read_csv(myfile, delim_whitespace=True, dtype=type_dict)

阅读后指定

通常您事先不会知道最佳类型。在这种情况下,您可以正常读入数据,并在后续步骤中显式执行 intfloat 转换:

df = pd.read_csv(myfile, delim_whitespace=True, dtype={'Col_A': 'category'})

cols = {k: df.select_dtypes([k]).columns for k in ('integer', 'float')}

for col_type, col_names in cols.items():
    df[col_names] = df[col_names].apply(pd.to_numeric, downcast=col_type)

print(df.dtypes)

Col_A    category
Col_B        int8
Col_C     float32
Col_D     float32
dtype: object

用于测试的设置

from io import StringIO

myfile = StringIO("""Col_A   Col_B   Col_C   Col_D
001       1       2      1.2
002       2       3      3.5
003       3       4.5      7
004       4       6.5     10""")

关于python - 根据 pandas 中的列索引在 csv 文件导入期间定义数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52958349/

相关文章:

python - Pandas 什么时候默认广播 Series 和 Dataframes?

python - 如何检查输入是否在矩阵的第一列内

python - 如果 Pandas 中两个单元格为空,则填充 .fillna 列

python - 使用 Numpy 迭代 DataFrame 行以创建新列

python - 创建 Python 子模块

java - 在java中读取CSV文件时无法打印空行

python - Pandas DataFrame 上的特定组计算

python - 从所有其他行中减去每一行并在 python 中查看为矩阵

python - Django loaddata 验证错误

java - 帮助 line.split CSV