【问题标题】:python, pandas and importing multiple csv's into a dataframepython,pandas并将多个csv导入数据框
【发布时间】:2015-12-05 21:47:45
【问题描述】:

我的代码从一个目录中获取多个 csv 文件,并将所有数据放入我创建并称为“df”的数据帧中。每个 CSV 格式相同,但可以有不同的长度,所以这就是我想要做的:

我想在我的 df (DataFrame) 中有一个列,记录我拉入的每个 csv 中倒数第二个数据,然后再移动到下一个数据。我已经修改了下面的输出,以给你一个例子来说明我的意思。假设我将此列称为 BeforeLast。当您看到 0 值时,这意味着它不是我提取的 csv 中倒数第二条数据,如果您看到 1 值,则意味着它是我提取的 csv 中倒数第二条数据。

当 Python 拉入每个调用的 csv 时,我该怎么做?

import pandas as pd
import glob
import os


path =r'X:\PublicFiles\TradingData\CSV\RealMarkets\Weekly\Futures\Contracts\Corn C'
allFiles = glob.glob(path + "/*.csv")  ##'*' means any file name can be grabbed
df = pd.DataFrame()
list_ = []

for file_ in allFiles:
    names = ['Date', 'Open', 'High', 'Low', 'Close', 'Vol', 'OI']
    df = pd.read_csv(file_, index_col = None, names = names)
    list_.append(df)
frame = pd.concat(list_)

这是我当前数据帧 (df) 的示例

    Date       Open    High     Low   Close   Vol  OI
0   20141212  427.00  427.00  427.00  427.00    0   0
1   20141219  429.00  429.00  424.00  424.00    0   0
2   20141226  424.00  425.00  423.00  425.00    0   0
3   20150102  422.75  422.75  417.50  417.50    0   0

这就是我想要的

    Date       Open    High     Low   Close   Vol  OI  BeforeLast
0   20141212  427.00  427.00  427.00  427.00    0   0  0
1   20141219  429.00  429.00  424.00  424.00    0   0  0
2   20141226  424.00  425.00  423.00  425.00    0   0  1
3   20150102  422.75  422.75  417.50  417.50    0   0  0 (this is the last piece of data in this csv and now it moves on to the next)
4   20141226  424.00  425.00  423.00  425.00    0   0  0
5   20150102  422.75  422.75  417.50  417.50    0   0  0
6   20141226  424.00  425.00  423.00  425.00    0   0  1
7   20150102  422.75  422.75  417.50  417.50    0   0  0

【问题讨论】:

    标签: python csv pandas import dataframe


    【解决方案1】:

    试试这个。您不需要列表。只需附加到原始数据框即可。

    .iloc[-2, -1] 是倒数第二行,最后一列

    我添加了一个索引重置,因为在我的测试中遇到了重复的索引号。

    import pandas as pd
    import glob
    import os
    
    
    path =r'X:\PublicFiles\TradingData\CSV\RealMarkets\Weekly\Futures\Contracts\Corn C'
    allFiles = glob.glob(path + "/*.csv")  ##'*' means any file name can be grabbed
    df = pd.DataFrame()
    
    for file_ in allFiles:
        names = ['Date', 'Open', 'High', 'Low', 'Close', 'Vol', 'OI']
        df_temp = pd.read_csv(file_, index_col = None, names = names)
        df_temp['beforelast'] = 0
        df_temp.iloc[-2,-1] = 1
        df = df.append(df_temp)
    
    df = df.reset_index(drop=True)
    

    【讨论】:

    • 嘿,这很棒!我注意到的一件事是我的列重新排列成不同的顺序。有什么快速的方法可以按照我订购 [name] 的方式将它们放回原处吗?
    • 尝试:df = df[names]
    【解决方案2】:

    在构建数据框时,只需创建一个列表来跟踪最后一列:

    import pandas as pd
    
    df = pd.DataFrame()
    newcol = []
    
    for i in range(10):
        # Load 10 files and get shape
        # length = df.shape[0]
        length = 10
        c = [0 for i in range(length)]
        c[-2] = 1
        newcol += c
    
    df['BeforeLast'] = newcol
    
    print df
    

    【讨论】:

    • 拥有多少文件并不重要。每次加载文件时,只需跟踪它使用 newcol 列表的时间。加载完所有文件后,只需将新列添加到完整的数据框中
    【解决方案3】:
    df = pd.DataFrame({'a': np.zeros(5)})
    df[-2:-1] = 1
    print df
    
       a
    0  0
    1  0
    2  0
    3  1
    4  0
    

    您可以在创建每个数据框时使用它吗?

    代码中的示例:

    for file_ in allFiles:
        names = ['Date', 'Open', 'High', 'Low', 'Close', 'Vol', 'OI']
        df = pd.read_csv(file_, index_col = None, names = names)
        before = np.zeros(len(df))
        before[-2] = 1
        df['before'] = before
        list_.append(df)
    frame = pd.concat(list_)
    

    【讨论】:

    • 好吧,虽然这看起来很有用,但在构建数据帧时,我如何将其合并到我的代码中?也许将那部分合并到 pd.read_csv(.... ?
    • 我使用 numpy 数组添加了一个更简单的版本,然后在追加之前将其添加到 df 中。
    猜你喜欢
    • 2021-01-22
    • 2020-02-17
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多