Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

'Series' objects are mutable, thus they cannot be hashed error calling to_csv

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))
like image 262
Robert Avatar asked Sep 14 '15 15:09

Robert


People also ask

How do you fix Series objects are mutable thus they Cannot be hashed?

– 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.

Are series mutable?

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).

What does To_csv do in pandas?

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.

What is header in To_csv?

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.


1 Answers

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

like image 160
EdChum Avatar answered Oct 23 '22 05:10

EdChum