【问题标题】:From multiples CSV to Dataframe columns with calculs从多重 CSV 到带有微积分的 Dataframe 列
【发布时间】:2021-11-23 00:43:50
【问题描述】:

我有 10 个这样的 csvfile:

我想通过 vwap 计算在我的数据框中添加 10 列。我尝试创建列,然后将其连接到数据框中,但它根本不起作用。我尝试了很多东西,主要问题是我无法创建带有计算行的新列:

import pandas as pd
import os
import glob
from IPython.display import display, HTML
import csv
# use glob to get all the csv files 
# in the folder

path = os.getcwd()
csv_files = glob.glob(os.path.join("*.csv"))

""" 
#To change the name of every columns
liste1 = []
header_list = []
for f in csv_files:
    liste1.append(f)
header_list = [a.strip(".csv") for a in liste1]
 """
def add(f):
    df = pd.read_csv(f, header=0)
    df["timestamp"] = pd.to_datetime(df["timestamp"])
    df = df.groupby(pd.Grouper(key = "timestamp", freq = "h")).agg("mean").reset_index()
    price = df["price"]
    amount = df["amount"]
    return df.assign(vwap  = (price * amount).cumsum() / amount.cumsum())

for f in csv_files:
    df = pd.read_csv(f, header=0)
    df2 = pd.concat(add(f))
    df2.to_csv(r"C:\Users\vion1\Ele\Engie\Sorbonne\resultat\resultat_projet_4.csv", encoding='utf-8', index=False, mode = "a")

感谢您的帮助

回溯:

TypeError                                 
Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_16732/557098648.py in <module>
     31 for f in csv_files:
     32     df = pd.read_csv(f, header=0)
---> 33     df2 = pd.concat(add(f))
     34     df2.to_csv(r"C:\Users\vion1\Ele\Engie\Sorbonne\resultat\resultat_projet_4.csv", encoding='utf-8', index=False, mode = "a")
     35 

~\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs)
    309                     stacklevel=stacklevel,
    310                 )
--> 311             return func(*args, **kwargs)
    312 
    313         return wrapper

~\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\reshape\concat.py in concat(objs, axis, join, ignore_index, keys, levels, names, verify_integrity, sort, copy)
    292     ValueError: Indexes have overlapping values: ['a']
    293     """
--> 294     op = _Concatenator(
    295         objs,
    296         axis=axis,

~\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\reshape\concat.py in __init__(self, objs, axis, join, keys, levels, names, ignore_index, verify_integrity, copy, sort)
    327     ):
    328         if isinstance(objs, (ABCSeries, ABCDataFrame, str)):
--> 329             raise TypeError(
    330                 "first argument must be an iterable of pandas "
    331                 f'objects, you passed an object of type "{type(objs).__name__}"'

TypeError: first argument must be an iterable of pandas objects, you passed an object of type "DataFrame"

【问题讨论】:

  • 定义“根本不起作用”。具体一点。
  • 对。在这段代码中,我得到了错误:TypeError: first argument must be an iterable of pandas objects,你传递了一个“DataFrame”类型的对象。但是我尝试了很多东西,主要问题是我无法创建具有计算行数的新列
  • 请将完整回溯添加到问题中。
  • 我把它添加到问题中

标签: python pandas dataframe merge concatenation


【解决方案1】:

如果只需要在输出中聚合值:

def add(df):
    #Removed read_csv 
    df["timestamp"] = pd.to_datetime(df["timestamp"])
    df = df.groupby(pd.Grouper(key = "timestamp", freq = "h")).agg("mean").reset_index()
    price = df["price"]
    amount = df["amount"]
    return (price * amount).cumsum() / amount.cumsum()

out = []
for f in csv_files:
    df = pd.read_csv(f, header=0)
    #added aggregate DataFrame with new column to list of DataFrames
    out.append(add(df))
    
#joined all dfs together
df2 = pd.concat(out, ignore_index=True, axis=1)  
#removed append mode
df2.to_csv(r"C:\Users\vion1\Ele\Engie\Sorbonne\resultat\resultat_projet_4.csv", 
             encoding='utf-8')

【讨论】:

  • 第二个不错。它会进行聚合,但不会为每个 csvfiles 创建新列。但无论如何它对我有很大帮助,谢谢
  • @SRP - it doesn't create new columns for every csvfiles. 所以这意味着函数def add(df): 中的代码df.assign(vwap = (price * amount).cumsum() / amount.cumsum()) 不起作用?不明白
  • 我得到的结果:i.imgur.com/rNZJ4la.png 这很好,但是你可以看到第二个 csv(以及之后的所有 csv)都低于第一个,我只想要每个 csv 的“vwap 列”。一列 = 一个 csv 的一个结果
  • @SRP - 你能检查编辑的答案 - this 吗?
  • 它不会创建新列。但我不再看到每个 csv 的标题,结果是:i.imgur.com/OeqbdAR.png
猜你喜欢
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2018-06-08
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多