【问题标题】:Pandas read_csv usecols same indexPandas read_csv usecols 相同的索引
【发布时间】:2017-01-04 04:05:44
【问题描述】:

考虑以下代码:

import pandas as pd
from StringIO import StringIO
x='''
a,b,c,d
1,2,3,4
5,6,7,8
9,10,11,12
13,14,15,16
17,18,19,20
'''

df = pd.read_csv(StringIO(x), skipinitialspace=True, usecols=[2,3,2])
print df

输出:

cd 0 3 4 1 7 8 2 11 12 3 15 16 4 19 20

有什么办法可以得到

CDC 0 3 4 3 1 7 8 7 2 11 12 11 3 15 16 15 4 19 20 19

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以使用iloc[]索引器:

    In [67]: pd.read_csv(StringIO(x), skipinitialspace=True).iloc[:, [2,3,2]]
    Out[67]:
        c   d   c
    0   3   4   3
    1   7   8   7
    2  11  12  11
    3  15  16  15
    4  19  20  19
    

    但是作为@Boud has already mentioned in comments,使用usecols 参数会更有效(因为我们不需要解析不需要的列,也不会为它们浪费内存),如果您知道 CSV 文件中任一列的名称:

    In [6]: pd.read_csv(StringIO(x), skipinitialspace=True, usecols=[2,3,2]).loc[:, ['c','d','c']]
    Out[6]:
        c   d   c
    0   3   4   3
    1   7   8   7
    2  11  12  11
    3  15  16  15
    4  19  20  19
    

    或者如果您知道他们的索引(在新的 DataFrame 中):

    In [7]: pd.read_csv(StringIO(x), skipinitialspace=True, usecols=[2,3,2]).iloc[:, [0,1,0]]
    Out[7]:
        c   d   c
    0   3   4   3
    1   7   8   7
    2  11  12  11
    3  15  16  15
    4  19  20  19
    

    PS 你可能还想了解Pandas boolean indexing

    【讨论】:

    • Brilliant!!!!!!你能描述一下你的答案,如果我的方法和你的方法有什么不同吗?我必须从 200 个文件中读取超过 4500 万行
    • iloc[:, [2,3,2]] 是一个位置索引器。 : 说取所有行。 [2,3,2] 说要在位置 2、3 和 2 中取列。你也可以这样做 loc[:, ['c', 'd', 'c']]
    • usecols 参数在函数def _validate_usecols_arg(usecols) 的parsers.py 中解析。此函数返回 set(usecols) 因此设计删除了 dupe 列。如果您考虑一下,这是有道理的,因为一个好的做法应该是解析一次感兴趣的列,然后 reindex_axis(['c', 'd', 'c', axis=1) 进行 I/O 和解析优化。
    • @vks 以避免解析 read_csv 中的无用列。上面的当前答案将为您的 45M 行解析 a、b、c、d 列,然后丢弃 a 和 b。 CPU 和内存浪费恕我直言
    • 正确。基本上,您首先加载必要的数据(使用 usecols 的 read_csv),然后以您想要的方式呈现数据(带有冗余列的 iloc)
    猜你喜欢
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2012-09-11
    • 2019-12-09
    • 2017-06-21
    • 2017-02-22
    • 2019-02-04
    相关资源
    最近更新 更多