如何在Python Pandas数据框中重命名列?

3

我是新手,想知道是否有人能够帮助我解决问题。

  • 我已经编写了下面显示的代码。
  • json文件的内容粘贴在脚本下面。
  • 在json内容下面,我们可以看到脚本输出结果。

我只想将输出数据框中每个列的名称设置为国家对象的名称(例如Germany或France)。

而不是得到这个输出结果

                  value    name        value     name
tag                                                  
capital           Paris  France       Berlin  Germany
population  34111000000  France  11233000000  Germany
language         French  France       German  Germany

...i would like something like this

                  France             Germany     
tag                                                  
capital           Paris         Berlin  Germany
population  34111000000    11233000000  Germany
language         French         German  Germany

任何帮助都将不胜感激:-)
以下是我的代码...
import numpy as np
import pandas as pd
import json

class Country(object):
    def __init__(self,name):
        self.name = name
        self.json = name + "_Data.json"

def ImportJson(x):
    ImportedJson = []
    for country in x:
        with open(country.json) as country_json_file:
            country_data = json.load(country_json_file)
            country_data_table = pd.DataFrame(country_data['data'], columns=['tag', 'value']).set_index('tag')
            country_data_table['name'] = country.name
        ImportedJson.append(country_data_table)
    return ImportedJson

France = Country("France")
Germany = Country("Germany")
All_Countries = [France,Germany]

OpenedJson = ImportJson(All_Countries)

Country_Data = pd.concat(OpenedJson,axis=1)
print Country_Data

这里是JSON文件:
Germany_Data.json
{
    "data": [
        {
            "tag": "capital",
            "value": "Berlin"
        },
        {
            "tag": "population",
            "value": 11233000000
        },
        {
            "tag": "language",
            "value": "German"
        }
    ],
    "result_count": 33,
    "page_size": 5000,
    "current_page": 1,
    "total_pages": 1,
    "api_call_credits": 1
}

France_Data.json

{
    "data": [
        {
            "tag": "capital",
            "value": "Paris"
        },
        {
            "tag": "population",
            "value": 34111000000
        },
        {
            "tag": "language",
            "value": "French"
        }
    ],
    "result_count": 33,
    "page_size": 5000,
    "current_page": 1,
    "total_pages": 1,
    "api_call_credits": 1
}
                  value    name        value     name
tag                                                  
capital           Paris  France       Berlin  Germany
population  34111000000  France  11233000000  Germany
language         French  France       German  Germany
2个回答

2
在您的函数ImportJson中,您有以下两行代码。
country_data_table = pd.DataFrame(country_data['data'], columns=['tag', 'value']).set_index('tag')
country_data_table['name'] = country.name

删除第二行并将此内容直接添加在其后。
country_data_table.rename(columns={'value':country.name}, inplace=True)

这为我提供了一个包含所有NaN值的DF。也许你的意思是执行country_data_table.rename(columns={'value':country.name}, inplace=True),而不是第二行代码。 - Nickil Maveli

2
我重写了你的
import numpy as np
import pandas as pd
import json

class Country(object):
    def __init__(self,name):
        self.name = name
        self.json = name + "_Data.json"
        with open(self.json, 'r') as fp:
            self.data = json.load(fp)['data']
        self.series = pd.DataFrame.from_records(
            self.data
        ).set_index('tag').value.rename(self.name)

France = Country("France")
Germany = Country("Germany")


pd.concat([c.series for c in [France, Germany]], axis=1)

                 France      Germany
tag                                 
capital           Paris       Berlin
population  34111000000  11233000000
language         French       German

如果您坚持操纵您构建的数据框。
# take transpose so I can groupby index and add a count column
# for each `name` and `value`.  Once I have a unique index, I can
# do more.
CD1 = Country_Data.T.set_index(
    Country_Data.T.groupby(level=0).cumcount(), append=True).T

# strategy is to filter `value` columns and reassign the columns
CD2 = CD1.filter(like='value')
CD2.columns = Country_Data.loc['capital', 'name'].tolist()

CD2

                 France      Germany
tag                                 
capital           Paris       Berlin
population  34111000000  11233000000
language         French       German

设置 json 文件
import json

with open('Germany_Data.json', 'w') as fp:
    json.dump(
        {
            "data": [
                {
                    "tag": "capital",
                    "value": "Berlin"
                },
                {
                    "tag": "population",
                    "value": 11233000000
                },
                {
                    "tag": "language",
                    "value": "German"
                }
            ],
            "result_count": 33,
            "page_size": 5000,
            "current_page": 1,
            "total_pages": 1,
            "api_call_credits": 1
        }
        , fp)

with open('France_Data.json', 'w') as fp:
    json.dump(
        {
            "data": [
                {
                    "tag": "capital",
                    "value": "Paris"
                },
                {
                    "tag": "population",
                    "value": 34111000000
                },
                {
                    "tag": "language",
                    "value": "French"
                }
            ],
            "result_count": 33,
            "page_size": 5000,
            "current_page": 1,
            "total_pages": 1,
            "api_call_credits": 1
        }
        , fp)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接