2017-05-26 72 views
1

我正在与一个熊猫数据帧具有在阵列条目,如下面的例子中的一列的工作在熊猫数据帧更换数组值:经由迭代

user_id tags 
0  1  [a,b,c] 
1  2  [a,b,d] 
2  3  [b,c] 
... 
n  n  [a,d] 

我有关联到一些标记ID在一个JSON对象简化的标签,我试图用下面的方法,以取代其非简化变种的条目:

for user_tags in dataset['tags']: 
    for tag in user_tags: 
     for full_tag in UUIDtags['tags_full']: 
      if full_tag['id'] == tag: 
       tag = entry['name'] 

idname对应简化标签和整个标签名称的JSON对象。

但是,这并不会改变执行时的值;有没有一种熊猫方法可以替代这些值?我担心我会替换整个阵列而不是替换单个条目。

谢谢!

编辑:什么是JSON对象(UUIDtags)包含的示例。

{ 
    "tags_full": [{ 
     "id": "a", 
     "name": "Alpha" 
    }, { 
     "id": "b", 
     "name": "Beta" 
.... 
+0

你可以发布其他数据'full_t'和'UUIDtags'的样子吗?很难通过访问只有一半的信息来测试想法... – spies006

+0

对不起!我解决了我的问题中的一些不一致之处,谢谢。 – Kam

回答

0

创建示例数据。

>>> df = pd.DataFrame({'tags':[list(['a', 'b', 'c']), 
list(['a', 'b', 'd']), list(['b', 'c'])], 'user_id': [i for i in range(1,4)]}) 

>>> df 
     tags user_id 
0 [a, b, c]  1 
1 [a, b, d]  2 
2  [b, c]  3 

生成一个以字母作为键和完整标记作为值的替换字典。

>>> replace_dict = {'a': 'Alpha', 'b': 'Beta', 'Charlie': 'c', 'Delta': 'd'} 

好了,回到了解决方案...做了行和信件的迭代各行中​​使用相应的值替换英寸

>>> for row in range(len(df)): 
...  for tag in range(len(df.loc[row, 'tags'])): 
...    df.loc[row, 'tags'][tag] = replace_dict[df.loc[row, 'tags'][tag]] 
... 

这是结果。

>>> df 
        tags user_id 
0 [Alpha, Beta, Charlie]  1 
1 [Alpha, Beta, Delta]  2 
2   [Beta, Charlie]  3 

旁注: 的​​创作是基于出现在我的样本数据中的字母替换字典的,而特设的创建。为了让你为你的完整数据生成一个这样的替换字典,你可以这样做。

例如,假设UUIDtags是完整的JSON对象

>>> UUIDtags = {'tags_full': [{'id':'a', 'name':'Alpha'}, {'id':'b', 'name':'Beta'}]} 

我们可以产生替代字典这样

>>> uuidtags_dict = {} 
>>> for tag in UUIDtags['tags_full']: 
...  uuidtags_dict[tag['id']] = tag['name'] 
... 
>>> uuidtags_dict 
{'a': 'Alpha', 'b': 'Beta'} 

这一代更换字典将扩展到整个JSON对象基于您在编辑中提供的示例。

+0

感谢您的详细回复!我认为我的理解非常透彻,但是我收到错误消息'KeyError:'执行时标签[7]不在[index]中;我正试图现在调试错误。 – Kam

+0

@Kam你可能需要重置'dataset'''数据集上的索引。reset_index(inplace = True)' – spies006

+0

你是对的,我以为我在那里!谢谢 - 现在就像魅力一样! – Kam