python - 使用 Pandas 在 Python 中读取大块的 csv 文件

标签 python csv 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

如您所见,数据是按日期排列的,每个数据集都是一个接一个地分块(在这种情况下,美元数据紧跟在欧元数据之后)。货币标签把事情搞得一团糟,数据变成了一个数据框。

我想要的是两个独立的数据框,如

     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.contains 查找 df['date'] 中以非数字开头的值。这些值被假定为货币。 掩码 在这些行上为 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
    
  2. df['date'].where(mask, np.nan) 返回一个系列,等于 df['date'] 其中掩码为 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 的那些行,从而删除标题行。

关于python - 使用 Pandas 在 Python 中读取大块的 csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21753922/

相关文章:

python - Spyne/RPClib - 如何响应 ComplexModel?

python - 验证 django 内联表单集

python - Visual Studio Code Intellisense 非常慢 - 我能做些什么吗?

php - 在 PHP 中对逗号分隔值列表运行选择

python - 如何从pandas数据框中提取索引值和元素值

python - Pytest + 多处理队列不能很好地协同工作

Ruby:数组的数组到哈希数组

mysql - 在MYSQL中导入海量数据集csv

python - 值错误: expected a dict or pandas.数据帧

python - 如何从打印的数据框字符串加载数据框?