2016-12-26 7 views
3

Я новичок в пандах и задавался вопросом, может ли кто-нибудь помочь мне.Как переименовать столбцы в python dataframe?

  • Я написали код, показанный ниже.
  • Содержимое json-файлов вставлено под сценарий.
  • Под содержимым json мы видим вывод скрипта.

я просто хотел бы задать имя каждого столбца в выходной dataframe как имя объекта страны (например, Германия или Франция)

вместо того, чтобы этот выход

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

... я хотел бы что-то вроде этого

    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

В вашей функции 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) 
+0

Это дает мне 'DF' со всеми' NaNs'. Возможно, вы хотели сделать - 'country_data_table.rename (columns = {'value': country.name}, inplace = True)' вместо второй строки. –

+0

Yup. Хороший улов. Столбцы уже названы. –

2

Я переписал свой class

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 

, если вы настаивали на манипулировании сконструированный dataframe

# 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)