【问题标题】:How to Pandas read_csv multiple records per line如何 Pandas read_csv 每行多条记录
【发布时间】:2016-05-03 01:51:03
【问题描述】:

(我是 pandas n00b)我有一些格式奇怪的 CSV 数据,类似于:

i   A           B           C       
    x   y   z   x   y   z   x   y   z
-------------------------------------
1   1   2   3   4   5   6   7   8   9
2   1   2   3   3   2   1   2   1   3
3   9   8   7   6   5   4   3   2   1

其中ABC 是分类属性,每个属性都存在xyz。我认为我想要做的(更大的split-apply-combine 步骤的一部分)是用 Pandas 读取数据,这样我就有了尺寸同质的观察,如下所示:

i   id  GRP   x   y   z
-----------------------
1   1   A     1   2   3
2   1   B     4   5   6
3   1   C     7   8   9
4   2   A     1   2   3
5   2   B     3   2   1
6   2   C     2   1   3
7   3   A     9   8   7
8   3   B     6   5   4
9   3   C     3   2   1

那么如何最好地做到这一点?

#1:我考虑使用基本的read_csv() 选项读取文件,然后迭代/切片/转置/以创建具有 i 结构的另一个数据框想。但在我的情况下,类别 (A,B,C) 和属性 (x,y,z) 的数量很大并且事先不知道的时间。如果扩展到大型数据集,我还担心内存问题。

#2:我喜欢在read_csv() 中设置iterator 参数然后每行产生多个观察值的想法。 (有什么理由不设置chunksize=1?)至少我不会以这种方式创建多个数据帧。

有什么更聪明的方法来做到这一点?

【问题讨论】:

  • 我能准确地看到以下数据的输出吗:data = []; with open(filename) as f: [data.append(f.readline()) for _ in range(5)] 其中文件名显然是文件的路径。

标签: python pandas dataframe iterator


【解决方案1】:

首先,我像您一样构建了示例数据框:

column = pd.MultiIndex(levels=[['A', 'B', 'C'], ['x', 'y', 'z']],
                       labels=[[i for i in range(3) for _ in range(3)], [0, 1, 2]*3])

df = pd.DataFrame(np.random.randint(1,10, size=(3, 9)),
                  columns=column, index=[1, 2, 3])

print df

#    A        B        C      
#    x  y  z  x  y  z  x  y  z
# 1  5  7  4  7  7  8  9  1  9
# 2  8  5  1  8  5  9  4  4  2
# 3  4  9  6  2  1  4  6  1  6

要获得所需的输出,请使用 df.stack() 重塑数据框,然后重置索引:

df = df.stack(0).reset_index()

df.index += 1    # to make index begin from 1

print df

#    level_0 level_1  x  y  z
# 1        1       A  5  7  4
# 2        1       B  7  7  8
# 3        1       C  9  1  9
# 4        2       A  8  5  1
# 5        2       B  8  5  9
# 6        2       C  4  4  2
# 7        3       A  4  9  6
# 8        3       B  2  1  4
# 9        3       C  6  1  6

然后您可以根据需要重命名列。希望对您有所帮助。

【讨论】:

  • tnx!当你初始化 df 时,size kwarg 的目的是什么?在 v0.18 docs 中没有看到这个参数。
  • 纳米。没有对paren分组给予足够的关注。
猜你喜欢
  • 2010-09-26
  • 2022-01-19
  • 1970-01-01
  • 2023-03-10
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 2017-01-02
相关资源
最近更新 更多