panda to_csv在偶尔缺少列时设置列顺序

tcomlyy6  于 2023-02-27  发布在  其他
关注(0)|答案(1)|浏览(155)

我正在使用panda将json数据转换为csv格式,但是我希望列是按一定顺序排列的。现在,有时在json数据中,一些列不存在。所以,这是我目前使用的:

cols = ['a','b','c','d','e','f']
pd.DataFrame(pd.json_normalize(json)).to_csv(columns=cols)

有时,如果d不存在,它会抱怨request failed because [d] is not in index。有没有办法让panda忽略不存在的列,但仍然保持列顺序?顺便说一句,json包含嵌套对象,但最大只有一个子层。
因此,如果列缺失,列顺序仍应为a,b,c,d,e,f,只是缺失列的所有行的值为空。例如,如果bd缺失,则:

a,b,c,d,e,f
one,,three,,five,six

谢谢

cwtwac6a

cwtwac6a1#

不妨试试:

cols = ['a','b','c','d','e','f']
df = pd.DataFrame(pd.json_normalize(json))
df.reindex(columns=cols).to_csv()

如果您只需要df中的列,但顺序为cols

df.to_csv(columns=[k for k in cols if k in df.columns])

示例(使用pd.json_normalize示例中的一个):

data = [
    {
        "id": 1,
        "name": "Cole Volk",
        "fitness": {"height": 130, "weight": 60},
    },
    {"name": "Mark Reg", "fitness": {"height": 130, "weight": 60}},
    {
        "id": 2,
        "name": "Faye Raker",
        "fitness": {"height": 130, "weight": 60},
    },
]
df = pd.json_normalize(data, max_level=1)

>>> df
    id        name  fitness.height  fitness.weight
0  1.0   Cole Volk             130              60
1  NaN    Mark Reg             130              60
2  2.0  Faye Raker             130              60

然后:

cols = ['id', 'name', 'age', 'fitness.height', 'fitness.weight']
print(df.reindex(columns=cols).to_csv())

,id,name,age,fitness.height,fitness.weight
0,1.0,Cole Volk,,130,60
1,,Mark Reg,,130,60
2,2.0,Faye Raker,,130,60

请注意,'age'列不存在于df中,因此CSV中的列为空。

相关问题