问题
代码如下:
import pandas as pd
import json
def a():
df = pd.DataFrame([[31, 'bob'], [21, 'alex']], index=['row_1', 'row_2'], columns=['age', 'name'])
print(df)
b(df)
print("over")
def b(df):
data = []
data.append({'class': 'a', 'age': df.at['row_1', 'age']})
data.append({'class': 'a', 'age': df.at['row_1', 'age']})
print(data)
data_json = json.dumps(data)
print("data to json")
if __name__ == '__main__':
a()
在函数b中,从dataframe df中取一个元素的值,和其他数据一起组成dict,两个dict再组成一个list。然后对这个list 进行json.dumps 操作。
期间,我们将df和data打印出来,如下,看起来都没有问题
df:
age name
row_1 31 bob
row_2 21 alex
data:
[{'class': 'a', 'age': 31}, {'class': 'a', 'age': 31}]
但是在执行代码的时候就会报错
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type int64 is not JSON serializable
报错在
data_json = json.dumps(data)
粗看data没有任何问题,list里有两个元素,每个元素一个dict。把data print出来的内容直接copy出来单独执行json.dumps也没有问题。但是一放到程序中执行就有问题了。
原因:
后来发现原因在于从dataframe中取元素的时候
df.at['row_1', 'age']
取出来的不是int,而是numpy.int64。 所以会报错TypeError: Object of type int64 is not JSON serializable。
解决办法:
一个最简单的解决办法就是将他转成int,
data.append({'class': 'a', 'age': int(df.at['row_1', 'age'])})
这样就没有问题了:
age name
row_1 31 bob
row_2 21 alex
[{'class': 'a', 'age': 31}, {'class': 'a', 'age': 31}]
data to json
over
其他方法可以查其他资料啦。