Pandas 向多个CSV添加带有计算的列

Pandas 向多个CSV添加带有计算的列,pandas,Pandas,我对Python非常熟悉,在尝试自动化一些计算时遇到了一些问题 我知道这可以添加一个名为“返回”的新列,将当前的“值”除以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"]/

我对Python非常熟悉,在尝试自动化一些计算时遇到了一些问题

我知道这可以添加一个名为“返回”的新列,将当前的“值”除以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教育中还没有达到这一点,所以任何指导都将不胜感激

1.a、b、c数据帧的尺寸是否相同

2.您不需要导入CSV库,因为它包含在Pandas库中

3.如果要合并数据帧,可以使用如下方式:

my_lists = [a,b,c]
您可以通过以下方式连接:

result=pd.concat(my_lists)
最后,你的计算应该是:

result["Returns"]=(result.loc[:, "close"].div(result.loc[:, "close"].shift()).fillna(0).replace([np.inf, -np.inf], 0))
您需要向数据框添加索引标签选择(
loc
)功能,以便访问这些值。当数字被除时,结果可以是NaN(不是数字)或无穷大。因此,
replace
fillna
函数与NaN和Inf相关

  • 假设“关闭”和“时间”是在csv文件的每个中定义的字段,您可以定义一个函数来读取每个文件、执行移位并返回数据帧:
  • def your_func(my_file):#此函数将文件名作为参数。
    my_df=pd.read_csv(my_file,index_col=“time”)#函数将其内容读入数据帧,
    my_df[“Returns”]=(my_df[“close”]/{my_df}[“close”])。shift(1)-1)*100进行计算
    返回我的_df#,并将其作为输出返回。
    
  • 然后,作为主代码,使用glob包从文件夹中收集所有csv文件。使用上述函数,您可以在计算完成后为每个文件构建一个数据框
  • 导入全局
    path=r'/Data/'#包含csv文件的目录的路径
    filenames=glob.glob(path+“/*.csv”)#使用存在path+所有csv文件的glob包获取csv文件名
    对于文件名中的文件名:#循环到目录中csv文件列表中的所有csv文件名
    df=your_func(filename)#调用上面代码块定义的函数,该函数将文件名作为参数读取,然后进行计算并返回。
    打印(df)
    
    上面是显示结果的数据框打印;我不确定你打算用upper做什么(我不认为这是数据帧上的函数)。
    最后,这将返回独立的数据帧,并在其他或最终转换之前进行计算。

    我建议您不要将
    {my_list}
    放在花括号内,除非您使用的是f字符串。我想这就是造成你语法错误的原因。谢谢你,尼克。当我去掉花括号时,我得到一个回溯错误,它说:TypeError:string索引必须是整数谢谢。1.它们都有相同的列标题2。好的,谢谢。3.好的,但在我看来,你在计算之前先加入他们。计算必须在将CSV连接在一起之前进行。这就是为什么我试着做某种循环的原因。谢谢Jerome,这对学前Python课的人来说是有意义的!是的,“时间”和“结束”都是每个CSV中的列标题。我唯一不明白的是,如何将所有文件的列表提供给您建议使用的my_文件?@jrcart ode的第一块是定义一个函数,该函数采用文件名并返回数据帧。第二个块在文件名列表中包含一个“for循环”(与从特定文件夹读取所有csv文件的包glob一起收集的文件名)。基本上,文件名列表中的每个文件(文件名)都通过函数“your_func”转换成一个数据帧。让我就答案补充一些意见。我希望这会有帮助。啊,好的。谢谢你的解释。这非常有帮助,而且非常有意义。非常感谢你的帮助@Jerome!出于好奇,是否可以使用.to_csv然后用这个新版本覆盖以前的文件?nm,我回答了我自己的问题。。。我添加了以下内容,效果非常好:df.to_csv(filename,header=True,index=True)