简体   繁体   中英

pandas change the order of columns

In my project I'm using flask I get a JSON (by REST API) that has data that I should convert to a pandas Dataframe. The JSON looks like:

{
    "entity_data":[
                  {"id": 1, "store": "a", "marker": "a"}
    ]
}

I get the JSON and extract the data:

params = request.json
entity_data = params.pop('entity_data')

and then I convert the data into a pandas dataframe:

entity_ids = pd.DataFrame(entity_data)

the result looks like this:

   id marker store
0   1      a     a

This is not the original order of the columns. I'd like to change the order of the columns as in the dictionary. help?

只需添加列名参数即可。

entity_ids = pd.DataFrame(entity_data, columns=["id","store","marker"])

Use OrderedDict for an ordered dictionary

You should not assume dictionaries are ordered. While dictionaries are insertion ordered in Python 3.7, whether or not libraries maintain this order when reading json into a dictionary, or converting the dictionary to a Pandas dataframe, should not be assumed.

The most reliable solution is to use collections.OrderedDict from the standard library:

import json
import pandas as pd
from collections import OrderedDict

params = """{
    "entity_data":[
                  {"id": 1, "store": "a", "marker": "a"}
    ]
}"""

# replace myjson with request.json
data = json.loads(params, object_pairs_hook=OrderedDict)
entity_data = data.pop('entity_data')

df = pd.DataFrame(entity_data)

print(df)

#    id store marker
# 0   1     a      a

Assuming you have access to JSON sender, you can send the order in the JSON itself.

like

`{
"order":['id','store','marker'],
"entity_data":{"id": [1,2], "store": ["a","b"],
"marker": ["a","b"]}
}

then create DataFrame with columns specified. as said by Chiheb.K.

import pandas as pd
params = request.json
entity_data = params.pop('entity_data')
order = params.pop('order')
entity_df=pd.DataFrame(data,columns=order)

if you cannot explicitly specify the order in the JSON. see this answer to specify object_pairs_hook in JSONDecoder to get an OrderedDict and then create the DataFrame

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM