python - Pandas:如何水平合并多个 CSV(键、值)文件并使用文件名在生成的 DF 中命名 `value` 列

标签 python csv pandas

我在一个目录中有 16 个不同的 csv 文件,我正在尝试将它们加载到一个 pandas 数据框中。每个文件都有 datetimefloat64 列。所有 CSV 文件都没有列标题。目录

location = os.path.join(base_dir, "DirectoryName")
symbols = os.listdir(location)
df = pd.DataFrame(index=dates)
for symbol in symbols:
    location = os.path.join(base_dir, "DirectoryName", symbol)
    df_temp = pd.read_csv(location, index_col=0, parse_dates=True, dayfirst=True, na_values=['nan'])
    df_temp.dropna()
    df_temp.index = df_temp.index.normalize()
    df_temp = normalize_data(df_temp)
    df = df.join(df_temp)

我现在遇到的问题是最终的数据帧df,其索引为datetime,但它的相应行值作为列名称,并且第一行填充为NaN

这是快照 notice row values for 2015-04-02

我必须删除 df 的第一行,但这在执行其他操作时没有多大帮助,因为一些数据会丢失。我无法重命名列标题,因为每个文件的列标题都不同,而且我只知道如何静态更改它。

最佳答案

我只下载了以下文件:

['hash_rate.csv',
 'difficulty.csv',
 'cost_per_tx.csv',
 'block_size.csv',
 'avg_block_size.csv']

这就是为什么您只会在生成的 DF 中看到数据的相应部分。

请在代码中查找注释。

代码:

import os
import glob
from collections import defaultdict
import pandas as pd

def read_files(filelist):
    # `dfs` - will contain a list of DFs
    # that will be concatenated later on
    dfs = []
    for fn in filelist:
        # parse column name from filename
        col = os.path.splitext(os.path.split(fn)[-1])[0]
        # read individual CSV (as data blocks from defaultdict) into temp DF
        # and add this temporary DF into `dfs` list
        dfs.append(pd.read_csv(
                        fn,
                        parse_dates=[0],
                        header=None,
                        index_col='date',
                        names=['date', col]
                   )
        )
    # return concatenated horizontally (axis=1) DF
    return pd.concat(dfs, axis=1)

def main():
    data_files_mask = r'D:\temp\.data\36827502\*.csv'
    df = read_files(glob.glob(data_files_mask))
    print(df)

if __name__ == '__main__':
    main()

输出:

                     block_size     hash_rate  avg_block_size  cost_per_tx  \
date
2015-01-05 18:15:05     34469.0  3.479099e+08        0.375637     8.185000
2015-01-06 18:15:05     36219.0  3.323940e+08        0.477130     6.598278
2015-01-07 18:15:05     38212.0  3.560892e+08        0.624724     6.232809
2015-01-08 18:15:05     40943.0  4.261981e+08        0.754424     7.113695
2015-01-09 18:15:05     43021.0  4.099610e+08        0.515467     6.199964
2015-01-10 18:15:05     45487.0  4.655484e+08        0.451940     6.821970
2015-01-11 18:15:05     47963.0  4.920513e+08        0.535354     7.958116
2015-01-12 18:15:05     50594.0  6.940933e+08        0.536199     9.415383
2015-02-04 18:15:05     32832.0  3.413843e+08        0.421406     8.054181
2015-02-05 18:15:05     34523.0  3.479099e+08        0.373642     8.958115

                       difficulty
date
2015-01-05 18:15:05  4.761056e+10
2015-01-06 18:15:05  4.880749e+10
2015-01-07 18:15:05  4.940201e+10
2015-01-08 18:15:05  5.227830e+10
2015-01-09 18:15:05  5.425663e+10
2015-01-10 18:15:05  6.081322e+10
2015-01-11 18:15:05  6.225398e+10
2015-01-12 18:15:05  7.272278e+10
2015-02-04 18:15:05  4.671755e+10
2015-02-05 18:15:05  4.761056e+10

关于python - Pandas:如何水平合并多个 CSV(键、值)文件并使用文件名在生成的 DF 中命名 `value` 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36827502/

相关文章:

python - 从具有非数字索引的数据框中删除行

python - 获取时间日期范围

python - 删除第二个数据帧间隔内的数据帧时间戳

python - 如何使用 playwright-python 处理多个页面?

python - flask-oauthlib 服务器不能很好地与 requests-oauthlib 客户端配合使用

python - 如何使用seaborn绘制带有嵌套数据的时间序列箱线图?

python - 在 Python 3 中编写 csv

python - 如何将 datetime.datetime 转换为 GMT 格式 python?

excel - 打开 CSV 文件

javascript - 错误: Number of columns is inconsistent on line 5 - While parsing CSV