在类内给Pandas DataFrame赋值导致TypeError
我在一个类里面对一个数据框(dataframe)进行计算:
这个数据框大概长这样:
JIBA3M Year Month Day Day_b MonthBegin
2014-01-01 0.05216 2014 1 1 1 2014-01-01 00:00:00
2014-01-02 0.05216 2014 1 2 1 2014-01-01 00:00:00
2014-01-03 0.05225 2014 1 3 1 2014-01-01 00:00:00
2014-01-04 0.05225 2014 1 4 1 2014-01-01 00:00:00
2014-01-05 0.05225 2014 1 5 1 2014-01-01 00:00:00
在类外面的ipython笔记本中,下面的代码可以互换使用:
df['MonthBegin'] = df[['Year', 'Month', 'Day_b']].apply(lambda s : datetime.datetime(*s), axis=1)
and
df['MonthBegin'] = df.apply(lambda x: datetime.datetime(x.Year, x.Month, 1), axis=1)
但是如果我在类的init方法里面尝试这段代码,第二种方式就会报错:
TypeError: ('integer argument expected, got float', u'occurred at index 2014-01-01 00:00:00')
我检查过,apply lambda
部分如果我用debug print
打印出来,结果是正常的。问题似乎出在把apply lambda的结果重新赋值给数据框上。
有什么想法吗?
1 个回答
1
你可以通过转换这些数据来确保它们是整数:
df['MonthBegin'] = df.apply(lambda x: datetime.datetime(int(x.Year), int(x.Month), 1), axis=1)
或者可以将每一列转换为确保它是int64类型(而不是浮点数):
df['Year'] = df['Year'].astype(np.int64)
df['Month'] = df['Month'].astype(np.int64)
注意:可能有一些NaN(缺失值)导致这些数据被转换成浮点数,这种情况下你可能需要重新考虑你的方法(因为你无法将它们转换为整数!),一种选择是先进行字符串格式化,然后再使用 to_datetime
:
df['Date'] = df.Year + '-' + df.Month + '-' + '01'
df['Date'] = pd.to_datetime(df['Date'])