在类内给Pandas DataFrame赋值导致TypeError

1 投票
1 回答
968 浏览
提问于 2025-04-18 04:05

我在一个类里面对一个数据框(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'])

撰写回答