【问题标题】:panda to_csv set column order when columns are missing occasionallypanda to_csv 在列偶尔丢失时设置列顺序
【发布时间】:2023-02-23 11:09:04
【问题描述】:

我正在使用 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。有没有办法让熊猫忽略不存在的列但仍然保持列顺序? 顺便说一句,json 包含嵌套对象,但最多只有 1 个子级。

因此,在缺少列的情况下,列顺序仍应为a,b,c,d,e,f,只是对于缺少的列,所有行的值将为空。 例如,如果缺少 bd,则:

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

谢谢

【问题讨论】:

  • 如果缺少 d,您希望发生什么?
  • @artemis 将列顺序保持为a,b,c,d,e,f,但列d 的所有行都将为空

标签: python pandas dataframe csv


【解决方案1】:

也许尝试:

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 中的列为空。

【讨论】:

  • 因此,为此,我需要将列标题保留为a,b,c,d,e,f,但对于缺少的列,所有行的值都将为空。重建索引会实现这一目标吗?谢谢
  • b,c 缺失的示例 -> a,b,c,d,e,f 一,,,四,五,六
  • 是的。请参阅带有示例的编辑答案。
  • 是的,这看起来不错。当我回到我的电脑时让我试试。如果这有效,我会接受你的回答。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-07-11
  • 2013-02-19
  • 2014-09-13
  • 2016-09-01
  • 2020-05-02
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
相关资源
最近更新 更多