2017-05-26 65 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