2016-07-07 55 views
2

我有一个大熊猫数据帧,看起来像这样的数据:追加字典元素到一个空的熊猫数据框列

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'}] 

我需要我的数据帧有一个额外的,第五列其中将包含所有的名称键与每行的元素称为“relevant_data”。这些数据点是根据parentName选择的。如果parentName ='relevant_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.loads呼叫无法呈现为JSON。)

这将产生对于我来说,第五列是一个数据框,但它在每一行中插入了相同的“name”元素。任何和所有的帮助表示赞赏,谢谢。

回答

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

我:“类型错误:‘海峡’对象不支持项目分配”当我更换与行的列。 – dataelephant

+1

我已经更新了答案。 – OmerBA

+0

执行该操作,但该列(第五列)中的所有数据都从第一个“relevant_data”中复制。有任何想法吗? – dataelephant