I have a large Dataframe (5 days with one value per second, several columns) of which I'd like to save 2 columns in a csv file with python pandas df.to_csv module.
I tried different ways but always get the error message:
'Series' objects are mutable, thus they cannot be hashed
which I found a solution for in connection with groupby but not with filesaving. Somebody has an idea for me?
Here a part of my Dataframe:
DateTime
2015-07-14 00:00:00 414.37
2015-07-14 00:00:00 414.37
2015-07-14 00:00:01 414.29
2015-07-14 00:00:02 414.14
2015-07-14 00:00:03 414.21
2015-07-14 00:00:04 414.05
2015-07-14 00:00:05 414.05
2015-07-14 00:00:06 414.2
2015-07-14 00:00:07 414.54
2015-07-14 00:00:08 414.39
Name: CO2abs, dtype: object DateTime
Edit: sorry - forgot the code...
df.to_csv('alldatcorr.csv',sep='\t',cols=(df.CO2abs,df.CO2corr))
– Mutable Objects Can Not Be Hashed In your case, the simple solution to this error could be to use the immutable objects that can be hashed. As you know, mutable objects can't be hashed, so you have to use the immutable objects as a key in the dictionary. You can use int, string, and tuple as a key.
Series is value-mutable but size-immutable. DataFrame is a 2-dimensional (2D) table of data with index labels and column labels. Each column in a DataFrame is a Series . DataFrame is value-mutable and size-mutable (mutable in terms of the column number).
Pandas DataFrame to_csv() function converts DataFrame into CSV data. We can pass a file object to write the CSV data into a file. Otherwise, the CSV data is returned in the string format.
header : boolean or list of string, default True. Write out column names. If a list of string is given it is assumed to be aliases for the column names. When giving either a list of columns, they put the columns into the order I specify.
Your error comes about because you passed a tuple of Series rather than a tuple of column names/strings:
df.to_csv('alldatcorr.csv',sep='\t',cols=(df.CO2abs,df.CO2corr))
So you found that this worked:
df.to_csv('corr2.csv',sep='\t',cols=('CO2abs','CO2corr'))
you could've avoided the ambiguity by just sub-selecting from your df by passing a list and using the sub-script operator:
df[['CO2abs','CO2corr']].to_csv('corr2.csv',sep='\t')
Also it's probably more readable to pass a list of strings rather than a tuple
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With