Python & Pandas。如何在 TextFileReader 对象中使用 "chunks" 的子集?
Python & Pandas. How to work with a subset of the "chunks" in a TextFileReader object?
我需要导入一个大的 .txt
文件(大约 10GB)来做一些计算。我在 Python 2.7.
中使用 Pandas
基本上,我需要构建某些系列(列)的总和和平均值,以其他系列的值为条件。更准确地说:我有一个国家的个人基本信息,例如,我想取每个城市的人的平均年龄。
我无法导入整个文件(因为它太大),所以我在"chunks"中导入(使用read_table
、chunksize
)。
对于每个计算,我不需要所有块,只需要其中的一个子集。
由于信息可能未排序,我首先遍历所有块以确定其中哪些块具有每个城市的信息。因此,对于每个自治市,我都有一个列表,其中包含至少一个属于它的观测值的组块索引。
然后我想将此列表用于 select 只有那些块,但我无法快速完成。
唯一似乎有效的方法是再次遍历所有块。
有没有办法在 TextFileReader
对象中直接 select "chunks" 的一个子集,而不必遍历所有对象?
我会尝试这样做:
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
列)和他们的年龄总和(sum
列)。
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_csv()
returns 一个 pandas.io.parsers.TextFileReader
而不是 DataFrame
一旦你指定 chunksize
:
In [6]: reader = pd.read_csv(r'D:\temp\.data.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
获取接下来的 3 行
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
我需要导入一个大的 .txt
文件(大约 10GB)来做一些计算。我在 Python 2.7.
基本上,我需要构建某些系列(列)的总和和平均值,以其他系列的值为条件。更准确地说:我有一个国家的个人基本信息,例如,我想取每个城市的人的平均年龄。
我无法导入整个文件(因为它太大),所以我在"chunks"中导入(使用read_table
、chunksize
)。
对于每个计算,我不需要所有块,只需要其中的一个子集。
由于信息可能未排序,我首先遍历所有块以确定其中哪些块具有每个城市的信息。因此,对于每个自治市,我都有一个列表,其中包含至少一个属于它的观测值的组块索引。
然后我想将此列表用于 select 只有那些块,但我无法快速完成。 唯一似乎有效的方法是再次遍历所有块。
有没有办法在 TextFileReader
对象中直接 select "chunks" 的一个子集,而不必遍历所有对象?
我会尝试这样做:
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
列)和他们的年龄总和(sum
列)。
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_csv()
returns 一个 pandas.io.parsers.TextFileReader
而不是 DataFrame
一旦你指定 chunksize
:
In [6]: reader = pd.read_csv(r'D:\temp\.data.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
获取接下来的 3 行
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