【问题标题】:pandas read_csv with data and headers in alternate columnspandas read_csv 与交替列中的数据和标题
【发布时间】:2021-04-07 12:04:45
【问题描述】:

我有一个生成的 CSV 文件

  1. 没有标题
  2. 标题和数据在每一行中交替出现(标题不会因行而异)。

例如:

imageId,0,feat1,30,feat2,34,feat,90
imageId,1,feat1,0,feat2,4,feat,89
imageId,2,feat1,3,feat2,3,feat,80

IMO,这种格式是多余且麻烦的(我不明白为什么有人会生成这种格式的文件)。相同数据的 saner/normal CSV(我可以使用 pd.read_csv() 直接读取:

imageId,feat1,feat2,feat
0,30,34,90
1,0,4,89
2,3,3,80

我的问题是,如何将原始数据读入 pd 数据框?现在,我执行read_csv,然后删除所有备用列:

df=pd.read_csv(file, header=None)
df=df[range(1, len(df.columns), 2]

问题是我没有得到标题,除非我特意指定它们。

有没有更简单的方法告诉 pandas 格式的每一行都有数据和标题?

【问题讨论】:

  • 可能有一些模糊的业务需求定义了 csv 以这种方式定义,是否没有文档或指导?如果列是一致的,下面的答案会很好用

标签: python-3.x pandas csv


【解决方案1】:

通过在DataFrame.iloc 中建立索引来选择列,并使用获取第一行和对值设置新列名(假设对列具有与示例数据中相同的值):

#default headers
df = pd.read_csv(file, header=None)

df1 = df.iloc[:, 1::2]
df1.columns = df.iloc[0, ::2].tolist()
print (df1)
   imageId  feat1  feat2  feat
0        0     30     34    90
1        1      0      4    89
2        2      3      3    80

【讨论】:

  • 您似乎在df=pd.read_csv(file, headers=None) 上构建您的解决方案。请原谅我可能很愚蠢的问题:pd.read_csv 是否包含一些一开始不会为所有冗余标头消耗内存的惰性机制?
  • @Wolf - 老实说不知道。
  • 我对熊猫世界还比较陌生:您能确认我的回答显示了一种资源消耗较少的方法吗?
【解决方案2】:

我没有测量,但我希望在过滤有趣的内容之前读取整个文件(冗余标题和实际数据)可能会出现问题。所以我尝试利用可选参数nrowsusecols 来(希望)限制处理CSV 输入文件所需的内存量。

# --- Utilities for generating test data ---
import random as rd

def write_csv(file, line_count=100):
    with open(file, 'w') as f:
        r = lambda : rd.randrange(100);
        for i in range(line_count):
            line = f"imageId,{i},feat1,{r()},feat2,{r()},feat,{r()}\n"
            f.write(line)

file = 'text.csv'

# Generate a small CSV test file
write_csv(file, 10)

# --- Actual answer ---
import pandas as pd

# Read columns of the first row
dfi = pd.read_csv(file, header=None, nrows=1)
ncols = dfi.size

# Read data columns
dfd = pd.read_csv(file, header=None, usecols=range(1, ncols, 2))
dfd.columns = dfi.iloc[0, ::2].to_list()
print(dfd)

【讨论】:

  • 我认为,如果你要逐行阅读,你还不如创建数据帧而不是添加新的磁盘读写。
猜你喜欢
  • 1970-01-01
  • 2015-09-03
  • 2021-05-08
  • 2017-05-01
  • 2019-08-10
  • 2016-12-12
  • 2018-12-04
  • 1970-01-01
相关资源
最近更新 更多