[英]Read very huge csv file in chunks using generators and pandas in python
[英]Reading chunks of csv file in Python using pandas
我有一个关于读取csv文件的碎片的问题。 刚刚使用时读取文件
pd.read_csv(path,sep=';',na_values=[''],thousands='.',decimal=',',date_parser=[0])
我明白了:
EUR 1Y 2Y 3Y
0 2013-09-25 0,198 0,307 0,485
1 2013-09-26 0,204 0,318 0,497
2 2013-09-27 0,204 0,306 0,487
3 2013-09-28 0,204 0,306 0,487
4 USD 1Y 2Y 3Y
5 2013-09-25 0,462 0,571 0,749
6 2013-09-26 0,468 0,582 0,761
7 2013-09-27 0,468 0,57 0,751
8 2013-09-28 0,468 0,57 0,751
正如您所看到的,数据按日期排列,每个数据集都是一个接一个的块(在这种情况下,USD-数据直接在EUR-数据之后)。 货币标签会使事情变得棘手,数据变成一个单一的数据框。
我想要的是两个独立的数据框,如
EUR 1Y 2Y 3Y
0 2013-09-25 0,198 0,307 0,485
1 2013-09-26 0,204 0,318 0,497
2 2013-09-27 0,204 0,306 0,487
3 2013-09-28 0,204 0,306 0,487
USD 1Y 2Y 3Y
0 2013-09-25 0,462 0,571 0,749
1 2013-09-26 0,468 0,582 0,761
2 2013-09-27 0,468 0,57 0,751
3 2013-09-28 0,468 0,57 0,751
也就是说,我想将每个货币数据集彼此分开。
有什么建议?
这是解决问题的另一种方法。 它将csv读入单个DataFrame,然后使用一些数据争用来创建货币列:
currency 1Y 2Y 3Y
date
2013-09-25 EUR 0,198 0,307 0,485
2013-09-26 EUR 0,204 0,318 0,497
2013-09-27 EUR 0,204 0,306 0,487
2013-09-28 EUR 0,204 0,306 0,487
2013-09-25 USD 0,462 0,571 0,749
2013-09-26 USD 0,468 0,582 0,761
2013-09-27 USD 0,468 0,57 0,751
2013-09-28 USD 0,468 0,57 0,751
然后,您可以根据使用groupby
的货币将DataFrame“拆分”为更小的DataFrame:
groups = df.groupby(['currency'])
for key, grp in groups:
print(grp)
import numpy as np
import pandas as pd
df = pd.read_table('data',sep=';',na_values=[''],thousands='.',decimal=',',
names=['date', '1Y', '2Y', '3Y'])
mask = df['date'].str.contains('^\s*\D') # 1
df['currency'] = (df['date']
.where(mask, np.nan) # 2
.fillna(method='ffill')) # 3
df = df.loc[~mask] # 4
print(df)
groups = df.groupby(['currency'])
for key, grp in groups:
print(grp)
使用str.contains
在df['date']
查找以非数字开头的值。 这些值被假定为货币。 这些行上的mask
为True
。
In [120]: mask Out[120]: 0 True 1 False 2 False 3 False 4 False 5 True 6 False 7 False 8 False 9 False Name: date, dtype: bool
df['date'].where(mask, np.nan)
返回一个Series,等于df['date']
,其中mask为True
,否则为np.nan
。 使用货币值向前填充nans
In [123]: df['date'].where(mask, np.nan).fillna(method='ffill') Out[123]: 0 EUR 1 EUR 2 EUR 3 EUR 4 EUR 5 USD 6 USD 7 USD 8 USD 9 USD Name: date, dtype: object
False
那些行,从而删除标题行。 使用nrows
和skiprows
参数来read_csv
因此,对于第一个数据帧,只读取前4行:
eur = pd.read_csv(path,sep=';',na_values=[''],thousands='.',decimal=',',date_parser=[0], nrows=4)
和后续的数据帧跳过前5行:
usd = pd.read_csv(path,sep=';',na_values=[''],thousands='.',decimal=',',date_parser=[0], skiprows=5)
应该管用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.