I'm trying to save my merged dataframe into a CSV file. As soon as the code hits on the "data.to_csv" line, it breaks. My code is as follows:

import pandas as pd import numpy as np import os,errno import glob print ("Path has been read successfully") path1 = glob.glob('S:\*Data\*Files\*Raw Data\*CPU\*Perf\*YesterdayDataset*.xlsx') print (path1) path2 = glob.glob("S:\*Data\*Files\*Raw Data\*CPU\*Perf\*CPUPerf_201920.csv") print ("Path has been read successfully") print ("Action has been completed successfully") data = [] for df in path1: df = pd.read_excel(df) data.append(df) data.to_csv("H:\\test1.csv", index = False) def sremove(): try: os.remove() except OSError as e: if e.errno != errno.ENOENT: raise 

The error I'm receiving after executing this code is:

AttributeError: 'list' object has no attribute 'to_csv'

Any help on that will be greatly appreciated. Thank you

1

4 Answers

The problem is your data object is a list of the DataFrames. You can either convert the DataFrames individually, e.g. df.to_csv(...) or merge them together and output as one file.

Try changing this part:

data = [] for df in path1: df = pd.read_excel(df) data.append(df) data.to_csv("H:\\test1.csv", index = False) 

To this:

df = pd.concat(pd.read_excel(fl) for fl in path1) df.to_csv("H:\\test1.csv", index = False) 

your problem is that you have a list of data frames and you are calling to_csv on the whole list instead of the individual data frames. Two options here, if the list only has one data frame in it, use this code:

data[0].to_csv("H:\\test1.csv", index = False) 

if it has multiple data frames in it, do this:

for i in data: i.to_csv("filename", index = False) 

bear in mind that for the second option you will need to make your filenames dynamic to avoid overwriting.

EDIT:

Misread your question. You need to actually merge the data frames

df1 = pd.read_excel(path1) df2 = pd.read_execl(path2) df = df1.merge(df2, how = 'inner', on = 'JoinField') df.to_csv("H:\\test1.csv", index = False) 
1

You're trying to use to_csv() function on a list and not on a dataframe. You have to merge your x dataframes to a single dataframe before you generate a csv from it.

Try something like this :

 import pandas as pd import numpy as np import os,errno import glob print ("Path has been read successfully") path1 = glob.glob('S:\*Data\*Files\*Raw Data\*CPU\*Perf\*YesterdayDataset*.xlsx') print (path1) path2 = glob.glob("S:\*Data\*Files\*Raw Data\*CPU\*Perf\*CPUPerf_201920.csv") print ("Path has been read successfully") print ("Action has been completed successfully") data = [] for df in path1: df = pd.read_excel(df) data.append(df) finaldf = pd.concat(data, axis=1, join='inner').sort_index() finaldf.to_csv("H:\\test1.csv", index = False) def sremove(): try: os.remove() except OSError as e: if e.errno != errno.ENOENT: raise 
2

fwiw, I had a similar issue when attempting to create a copy of a dataframe.

df_copy = df[uids + ['id', 'name']].copy vs df_copy = df[uids + ['id', 'name']].copy() 

Leaving the "()" off of the function call resulted in a list of dataframes and I received the same error as OP

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.