我需要使用某些数据类型初始化一个空的pandas DataFrame列,然后将一些行添加到DataFrame中,这些行可能不包含所有列,但是列的内容必须是在DataFrame时声明的内容。 有办法吗?
record_list = [
{ 'lastname' : 'Ford',
'firstname' : 'Ana',
'agreed' : 0
},
{ 'lastname' : 'Snow',
'agreed' : 'a'
}
]
df = pd.DataFrame({
'lastname' : np.array([], dtype=np.object),
'firstname' : np.array([], dtype=np.object),
'agreed' : np.array([], dtype=np.int64)
})
for record in record_list:
df = df.append([record], ignore_index=True)
以上操作将失败,因为'agreed'是字符串,而不是int,但是如果它是int,则即使第二个记录的类型为str,也应在数据帧中放置一个NaN。 我也分别尝试了column和dtype,但是没有用。请帮忙!
答案 0 :(得分:0)
目前尚不清楚您最终想要什么。但是我在解释我所理解的。将熊猫视为传统数据库。您不能将str和int放在同一列。但是默认情况下,在熊猫中,如果数据类型为int的列中有NaN
,它将始终将数据显示为十进制Ex。 0.0
最好先清除数据并插入新列表,然后直接读取到数据框。
new_data = []
for item in record_list:
agrd = item.get("agreed", None)
if isinstance(agrd, int):
new_data.append(item)
else:
item["agreed"] = None
new_data.append(item)
df = pd.DataFrame(new_data)
结果:
agreed firstname lastname
0 0.0 Ana Ford
1 NaN NaN Snow
因为有NaN个熊猫将始终显示小数而不是int。因此,您可以用df.<columnname>.fillna(value=-1)
替换NaN,然后使用df["columnname"] = df.columnname.astype(int)
答案 1 :(得分:0)
一旦数据加载完毕,您就可以像下面那样使用pd.to_numeric()
进行验证,并按自己的意愿对待它们:
df=df.append(record_list)
df.agreed=np.where(pd.to_numeric(df.agreed,errors='coerce').isna(),np.nan,df.agreed)
print(df)
lastname firstname agreed
0 Ford Ana 0
1 Snow NaN NaN