Python&;熊猫。如何使用“的子集”;“块”;在TextFileReader对象中?

Python&;熊猫。如何使用“的子集”;“块”;在TextFileReader对象中?,python,pandas,import,chunks,Python,Pandas,Import,Chunks,我需要导入一个大的.txt文件(大约10GB)来进行一些计算。我在Python2.7中使用Pandas 基本上,我需要构造某些系列(列)的总和和平均值,以其他系列的值为条件。更准确地说:我有生活在一个国家的个人的基本信息,例如,我想计算每个城市居民的平均年龄 我无法导入整个文件(因为它太大),所以我是“分块”导入的(使用read\u table,chunksize)。 对于每个计算,我不需要所有的块,只需要它们的一个子集 由于信息可能没有排序,我首先遍历所有块,以确定其中哪些块包含每个市镇的信息

我需要导入一个大的
.txt
文件(大约10GB)来进行一些计算。我在Python2.7中使用Pandas

基本上,我需要构造某些系列(列)的总和和平均值,以其他系列的值为条件。更准确地说:我有生活在一个国家的个人的基本信息,例如,我想计算每个城市居民的平均年龄

我无法导入整个文件(因为它太大),所以我是“分块”导入的(使用
read\u table
chunksize
)。 对于每个计算,我不需要所有的块,只需要它们的一个子集

由于信息可能没有排序,我首先遍历所有块,以确定其中哪些块包含每个市镇的信息。所以,对于每个城市,我都有一个包含至少一个属于它的观测值的块索引的列表

然后我想用这个列表只选择那些块,但我不能快速地完成。 唯一有效的方法是再次迭代所有块


有没有一种方法可以直接选择
TextFileReader
对象中“chunk”的一个子集,而不必遍历所有对象?

我会尝试这样做:

res = \
pd.concat([df.assign(age=(pd.datetime.now() - df.dob).astype('m8[Y]').astype(int))
             .groupby(['country','municipality'])['age'].agg(['size','sum']).reset_index()
           for df in pd.read_csv('/path/to/file.txt', sep=..., chunksize=10**5) ],
          ignore_index=True)

res = res.groupby(['country','municipality'], as_index=False).sum()
这将为您提供每个城市的总人数(
size
column)及其年龄总和(
sum
column)

sum/size
-将给出每个城市的平均年龄

更新:您可以使用以下技巧来计算动态年龄:

In [164]: df
Out[164]:
   country municipality        dob
0  Ukraine           m1 1950-01-01
1  Ukraine           m1 1960-12-14
2      USA           m2 1971-11-27
3      USA           m2 1982-11-09
4      USA           m3 1993-10-22
5  Germany           m1 2004-10-04
6  Germany           m2 2015-09-17

In [165]: df.assign(age=(pd.datetime.now() - df.dob).astype('m8[Y]').astype(int))
Out[165]:
   country municipality        dob  age
0  Ukraine           m1 1950-01-01   67
1  Ukraine           m1 1960-12-14   56
2      USA           m2 1971-11-27   45
3      USA           m2 1982-11-09   34
4      USA           m3 1993-10-22   23
5  Germany           m1 2004-10-04   12
6  Germany           m2 2015-09-17    1
UPDATE2:
pd.read\u csv()
在指定
chunksize
后,立即返回
pandas.io.parsers.TextFileReader
而不是
DataFrame

In [6]: reader = pd.read_csv(r'D:\temp\.data\1.csv', chunksize=3, sep='\s+')

In [7]: type(reader)
Out[7]: pandas.io.parsers.TextFileReader
得到2行

In [12]: reader.get_chunk(2)
Out[12]:
      foo  foo.1   bar  bar.1  spam  spam.1
foo  0.00   0.35  0.83   0.84  0.90    0.89
foo  0.35   0.00  0.86   0.85  0.92    0.91
下三排

In [13]: reader.get_chunk(3)
Out[13]:
       foo  foo.1   bar  bar.1  spam  spam.1
bar   0.83   0.86  0.00   0.25  0.88    0.87
bar   0.84   0.85  0.25   0.00  0.82    0.86
spam  0.90   0.92  0.88   0.82  0.00    0.50
您可以使用:

for df1 in pd.read_csv('______.csv',chunksize=5):
    print(df1)
df

非常感谢@MaxU的回答。我相信这对我在问题中给出的具体例子是有效的。然而,在某些情况下,我必须在进行计算之前处理数据,我想知道是否有可能避免每次对所有块进行迭代。特别是,如果没有['age']列,而是有['date\u of_birth']列,您将如何修改代码?再次感谢!谢谢@MaxU。我仍然不知道是否可以“选择”某些块,但您的解决方案很好,并且不需要这样做。如果您碰巧知道,我想知道如何使用
TextFileReader
对象,因为我显然不知道它到底是什么以及它是如何工作的。