2016-07-07 1 views
2

У меня есть данные в панде dataframe, который выглядит следующим образом:Append словарь элементы в пустой столбец Панда Dataframe

queryName Market tags categoryDetails 
dummy_query (dummy_market) dummy_market dummy_tag [{'name': 'relevant_data', 'parentName': 'relevant_scrape', 'parentId': '289245228', 'id': '2892695401'}, {'name': 'relevant_data', 'parentName': 'relevant_scrape', 'parentId': '289245228', 'id': '21892718'}, {'name': 'dummy_data', 'parentName': 'Location', 'parentId': '21221517840', 'id': '229565351'}] 
dummy_query (dummy_market) dummy_market dummy_tag [{'name': 'relevant_data', 'parentName': 'relevant_scrape', 'parentId': '289245228', 'id': '2892659'}, {'name': 'relevant_data', 'parentName': 'relevant_scrape', 'parentId': '289245228', 'id': '2892667'}, {'name': 'irrelevant_data', 'parentName': 'irrelevant_scrape', 'parentId': '2662610', 'id': '268415777'}, {'name': 'dummy_data', 'parentName': 'Location', 'parentId': '21221517840', 'id': '2565351'}] 
dummy_query (dummy_market) dummy_market dummy_tag [{'name': 'relevant_data', 'parentName': 'relevant_scrape', 'parentId': '289245228', 'id': '2892695401'}, {'name': 'irrelevant_data', 'parentName': 'irrelevant_scrape', 'parentId': '2662610', 'id': '268415777'}, {'name': 'dummy_data', 'parentName': 'Location', 'parentId': '21221517840', 'id': '229565351'}, {'name': 'Consideration', 'parentName': 'irrelevant_scrape', 'parentId': '2203873', 'id': '2203874'}] 
dummy_query (dummy_market) dummy_market dummy_tag [{'name': 'relevant_data', 'parentName': 'relevant_scrape', 'parentId': '289245228', 'id': '2892695401'}, {'name': 'irrelevant_data', 'parentName': 'irrelevant_scrape', 'parentId': '2662610', 'id': '268415777'}, {'name': 'dummy_data', 'parentName': 'Location', 'parentId': '21221517840', 'id': '229565351'}] 
dummy_query (dummy_market) dummy_market dummy_tag [{'name': 'relevant_data', 'parentName': 'relevant_scrape', 'parentId': '289245228', 'id': '21892718'}, {'name': 'irrelevant_data', 'parentName': 'irrelevant_scrape', 'parentId': '2662610', 'id': '268415777'}, {'name': 'dummy_data', 'parentName': 'Location', 'parentId': '21221517840', 'id': '229565351'}] 
dummy_query (dummy_market) dummy_market dummy_tag [{'name': 'relevant_data', 'parentName': 'relevant_scrape', 'parentId': '289245228', 'id': '2892659'}, {'name': 'dummy_data', 'parentName': 'Location', 'parentId': '21221517840', 'id': '229565351'}, {'name': 'dummy_data', 'parentName': 'irrelevant_scrape', 'parentId': '2203873', 'id': '2203880'}] 

Мне нужно dataframe иметь дополнительный, пятый столбец, который будет содержать все ключи имен с элементы, называемые «релевантные_даты» для каждой строки. Эти точки данных выбираются исходя из имени parentName. Если parentName = 'actual_scrape', выберите «имя».

Как мне это сделать? Вот мой код до сих пор.

import pandas as pd 
import json 
from pandas import DataFrame, read_csv 

df = pd.read_csv('dataset.csv', sep = '\t') 
for row in df.categoryDetails: 
    if isinstance(row, str): 
     list_dicts = json.loads(row.replace("'", "\"")) 
     for each_dict in list_dicts: 
      if each_dict["parentName"] == "relevant_scrape": 
       df['fifth_column'] = each_dict["name"] 

df.to_csv('output.txt', sep = '\t') 

(Примечание: мой исходные данные немного неаккуратно и не может быть вынесено как JSON, пока я не заменил его в кавычки двойные кавычки Следовательно json.loads слово.).

Это дает для меня фреймворк с пятым столбцом, но он вставляет то же точное «имя» в каждой строке. Любая помощь приветствуется, спасибо.

ответ

1

Вы используете df['fifth_column'] = each_dict["name"], который задает все значения в столбце 'fifth_column' одинаковому значению для каждой итерации, поскольку по умолчанию операции pandas являются столбцами по умолчанию.

Может быть, вы должны попробовать следующий фрагмент кода:

def extract_details(row): 
    # your parsing logic. 
    if isinstance(row, str): 
     list_dicts = json.loads(row.replace("'", "\"")) 
     all_relevant_data = [] 
     for each_dict in list_dicts: 
      if each_dict["parentName"] == "relevant_scrape": 
       all_relevant_data.append(each_dict["name"]) 
     return ','.join(all_relevant_data) 

, а затем вы можете сделать:

df['fifth_column'] = df.categoryDetails.apply(extract_details) 
+0

я получил: «TypeError:„ул“объект не поддерживает назначение элемента», когда я заменил столбец со строкой. – dataelephant

+1

Я обновил ответ. – OmerBA

+0

Выполнено, но все данные в этой колонке (пятый столбец) дублируются из первого фрагмента «релевантные_данные». Есть идеи? – dataelephant