繁体   English   中英

使用pandas在Python中读取csv文件的块

[英]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)

  1. 使用str.containsdf['date']查找以非数字开头的值。 这些值被假定为货币。 这些行上的maskTrue

     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 
  2. df['date'].where(mask, np.nan)返回一个Series,等于df['date'] ,其中mask为True ,否则为np.nan
  3. 使用货币值向前填充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 
  4. 仅选择掩码为False那些行,从而删除标题行。

使用nrowsskiprows参数来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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM