Преобразуйте CSV-файл во вложенный JSON -подобный файл, используя pandas - PullRequest
1 голос
/ 07 мая 2020

Я pandas / Python newb ie, и мне было интересно, не могли бы вы помочь мне со следующей проблемой.

Рассмотрим следующий файл csv:

country,continent,year,productA,productB
NLD,Europe,2012,1000,500
NLD,Europe,2013,100,50
NLD,Europe,2014,150,40
NLD,Europe,2015,200,70
CAN,America,2012,30,40
CAN,America,2013,50,90
CAN,America,2014,200,2000
CAN,America,2015,20,30
JPN,Asia,2012,100,2000
JPN,Asia,2013,400,100
JPN,Asia,2014,300,3000
JPN,Asia,2015,400,370

Я хотел бы переписать его как JSON -подобный файл:

[
  {
    country: 'NLD',
    continent: 'Europe',
    productA: {
      2012: '1000',
      2013: '100',
      2004: '150',
      2005: '200',
    },
    productB: {
      2012: '500',
      2013: '50',
      2004: '40',
      2005: '70',
    },
  },
  {
    country: 'CAN',
    continent: 'America',
    productA: {
      2012: '30',
      2013: '50',
      2004: '200',
      2005: '20',
    },
    productB: {
      2012: '40',
      2013: '90',
      2004: '200',
      2005: '30',
    },
  },
  {
    country: 'JPN',
    continent: 'Asia',
    productA: {
      2012: '100',
      2013: '400',
      2004: '300',
      2005: '400',
    },
    productB: {
      2012: '2000',
      2013: '100',
      2004: '3000',
      2005: '370',
    },
  },
]

Этот вопрос похож, но я не смог адаптировать ответ к своим потребностям из-за моих ограниченных возможностей. знание. Используя ответ на указанный вопрос, я могу написать этот фрагмент:

json = (df.groupby(['country','continent'], as_index=False)
.apply(lambda x: dict(zip(x.year,x.productA)))
.reset_index()
.rename(columns={0:'productA'})
.to_json(orient='records'))

, что приведет к

[
  {
    country: 'NLD',
    continent: 'Europe',
    productA: {
      2012: '1000',
      2013: '100',
      2004: '150',
      2005: '200',
    },
  },
  {
    country: 'CAN',
    continent: 'America',
    productA: {
      2012: '30',
      2013: '50',
      2004: '200',
      2005: '20',
    },
  },
  {
    country: 'JPN',
    continent: 'Asia',
    productA: {
      2012: '100',
      2013: '400',
      2004: '300',
      2005: '400',
    },
  },
]

Я был бы очень признателен, если бы вы помогли мне достичь желаемого вывод (включение productB) и предложения ресурсов, которые я мог бы использовать для улучшения своих навыков обработки данных, используя Pandas.

Спасибо!

1 Ответ

0 голосов
/ 07 мая 2020

Обратите внимание, что pd.df_to_dict() делает почти то, что вы хотите (даже ориентация правильная - см. документацию для других параметров. Чтобы получить кортеж страны-континента, просто сделайте al oop

dictlist=[]
for i, j in df.groupby(['country', 'continent'):
    thedict =  j.to_dict()
    thedict["country"]= i[0]
    thedict["continent"] = i[1]
    dictlist.append(thedict)

Я почти уверен, что небольшая вариация этого варианта сделает то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...