gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:15:11 24 4
gpt4 key购买 nike

我有一个关于读取 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com