如何使用Pandas read_csv将CSV最后3列读取为数组字段?
用Pandas实现将CSV最后三列合并为数组列的方案
当然可以用Pandas搞定这个需求!你之前用NumPy的结构化数组实现了把最后三列打包成数组的效果,Pandas虽然不能直接通过dtype参数一步到位,但通过简单的后处理就能达成同样的目标,甚至更灵活。
问题原因
首先得说明:Pandas的dtype参数是用来指定单个列的数据类型的,不支持像NumPy那样把多列映射成一个数组类型的字段,所以你之前的写法会把ValArray当成一个单独的列名去匹配,自然达不到合并的效果。
完整解决方案
咱们分几步来实现:
读取原始数据并指定列名
先把所有列读进来,同时给每一列命名(包括最后三列的临时名称),并指定前几列的正确数据类型:import pandas as pd import numpy as np # 定义所有列的名称(前三个是你要的标签,最后三个临时命名) column_names = ['Date', 'Val', 'Fruit', 'temp_col1', 'temp_col2', 'temp_col3'] # 读取CSV,指定列名和单列数据类型 df = pd.read_csv( 'My input file', sep=',', header=None, names=column_names, dtype={ 'Date': str, # 如果你需要和NumPy的'a10'一致,也可以用'S10'(字节字符串) 'Val': float, 'Fruit': str }, skipinitialspace=True # 对应你之前的autostrip=True,去掉逗号后的空格 )将最后三列合并为数组列
选择临时命名的三列,把它们转换成numpy数组(或列表)并添加为新的ValArray列:# 方式1:用apply生成numpy数组(和你NumPy的效果一致) df['ValArray'] = df[['temp_col1', 'temp_col2', 'temp_col3']].apply(np.array, axis=1) # 方式2:更高效的to_numpy方法(推荐处理大数据集) df['ValArray'] = list(df[['temp_col1', 'temp_col2', 'temp_col3']].to_numpy())清理临时列
最后把不需要的临时三列删掉,得到你想要的结构:df = df.drop(['temp_col1', 'temp_col2', 'temp_col3'], axis=1)
最终效果
处理后的DataFrame会包含Date、Val、Fruit和ValArray四个列,其中ValArray的每个元素都是包含三个浮点数的numpy数组,和你用NumPy生成的结构化数组效果一致。
额外提示
- 如果你需要保留字节字符串类型(对应NumPy的
a10),可以把str改成'S10',比如'Date': 'S10'。 - 如果你更倾向于用列表而不是numpy数组,把
np.array换成list即可,比如apply(list, axis=1)。
内容的提问来源于stack exchange,提问作者RJCL
相关产品推荐
相关产品推荐

