首页 > 解决方案 > 将包含计算的列添加到多个 CSV

问题描述

我对 Python 非常熟悉,并且在尝试自动执行某些计算时遇到了一些问题。

我知道这可以添加一个名为“Returns”的新列,它将当前的“值”划分为csv之前的“值”:

import pandas as pd
import numpy as np
import csv
a = pd.read_csv("/Data/a_data.csv", index_col = "time")    
a ["Returns"] = (a["value"]/a["value"].shift(1) -1)*100

但是,我有很多这样的 CSV。我需要在将它们合并在一起之前进行此计算。所以我希望写一些刚刚遍历所有 CSV 并进行计算并添加列的东西,但显然这是不正确的,因为我得到了语法错误:

import pandas as pd
import numpy as np
import csv
a = pd.read_csv("/Data/a_data.csv", index_col = "time")
b = pd.read_csv("/Data/b_data.csv", index_col = "time")
c = pd.read_csv("/Data/c_data.csv", index_col = "time")
my_lists = ['a','b','c']

for my_list in my_lists:
    {my_list}["Returns"] = ({my_list}["close"]/{my_list}["close"].shift(1) -1)*100
    print(f"Calculating: {my_list.upper()}")

我确信有一种简单的方法可以做到这一点,我只是在我的 Python 教育中还没有达到,所以任何指导将不胜感激!

标签: pandas

解决方案


  1. 假设“ close ”和“ time ”是在每个csv 文件中定义的字段,您可以定义一个读取每个文件、执行移位并返回数据帧的函数:
def your_func(my_file):  # this function takes a file name as an argument. 
    my_df = pd.read_csv(my_file, index_col = "time")  # The function reads its content into a data frame,
    my_df["Returns"] = (my_df["close"]/{my_df}["close"].shift(1) -1)*100  #  makes the calculation 
    return my_df   #and returns it as an output.
  1. 然后作为主要代码,您从带有glob包的文件夹中收集所有 csv 文件。使用上述函数,您可以为每个文件构建一个数据框,并完成计算。
    import glob  
    path =r'/Data/'  # path to the directory where you have the csv files
    filenames = glob.glob(path + "/*.csv")  # grab the csv files names using glob package with path+all csv files present 
    for filename in filenames:  # loop into all csv files names in the list of csv files present in the directory
        df= your_func (filename) # call the function, defined above block of code,  that reads the file from its name as argument, then makes the calculation and returns it. 
        print (df)  

上面是显示结果的数据框的打印件;我不确定你打算用upper做什么(我不认为这是数据框上的函数)。最后,这将返回独立的数据帧,并在其他或最终转换之前完成计算。


推荐阅读