dia
dia

Reputation: 431

TypeError: 'DataFrame' object is not callable in concatenating different dataframes of certain types

I keep getting the following error.

enter image description here

I read a file that contains time series data of 3 columns: [meter ID] [daycode(explain later)] [meter reading in kWh]

consum = pd.read_csv("data/File1.txt", delim_whitespace=True, encoding = "utf-8", names =['meter', 'daycode', 'val'], engine='python')
consum.set_index('meter', inplace=True)
test = consum.loc[[1048]]

I will observe meter readings for all the length of data that I have in this file, but first filter by meter ID.

test['day'] = test['daycode'].astype(str).str[:3]
test['hm'] = test['daycode'].astype(str).str[-2:]

For readability, I convert daycode based on its rule. First 3 digits are in range of 1 to 365 x2 = 730, last 2 digits in range of 1 to 48. These are 30-min interval reading of 2-year length. (but not all have in full)

So I create files that contain dates in one, and times in another separately. I will use index to convert the digits of daycode into the corresponding date & time that these file contain.

#dcodebook index starts from 0. So minus 1 from the daycode before match
dcodebook = pd.read_csv("data/dcode.txt", encoding = "utf-8", sep = '\r', names =['match'])
#hcodebook starts from 1
hcodebook = pd.read_csv("data/hcode.txt", encoding = "utf-8", sep ='\t', lineterminator='\r', names =['code', 'print'])
hcodebook = hcodebook.drop(['code'], axis= 1)

For some weird reason, dcodebook was indexed using .iloc function as I understood, but hcodebook needed .loc.

#iloc: by int-position
#loc: by label value
#ix: by both
day_df = dcodebook.iloc[test['day'].astype(int) - 1].reset_index(drop=True)
#to avoid duplicate index Valueerror, create separate dataframes..
hm_df = hcodebook.loc[test['hm'].astype(int) - 1]
#.to_frame error / do I need .reset_index(drop=True)?

The following line is where the code crashes.

datcode_df = day_df(['match']) + ' ' + hm_df(['print'])
print datcode_df
print test

What I don't understand:

Please advise.

Upvotes: 1

Views: 4465

Answers (1)

jezrael
jezrael

Reputation: 862711

You need same size of both DataFrames, so is necessary day and hm are unique.

Then reset_index with drop=True for same indices and last remove () in join:

day_df = dcodebook.iloc[test['day'].astype(int) - 1].reset_index(drop=True)
hm_df = hcodebook.loc[test['hm'].astype(int) - 1].reset_index(drop=True)

datcode_df = day_df['match'] + ' ' + hm_df['print']

Upvotes: 1

Related Questions