2014-03-03 53 views
1

我是新來的蟒蛇和熊貓,我試圖操縱一個CSV數據文件。我加載兩個數據框,其中一個包含帶關鍵字的列,另一個是帶有「id」和「word」列的「bagOfWords」。我想做的是在第一個數據框中添加一列,並在「列表字符串」中加上關鍵字的id,就像這樣「[1,2,8,99 ...]」。Python Pandas DataFrame單元格變化消失

這就是我想出迄今

websitesAlchData = pd.io.parsers.read_csv('websitesAlchData.csv', sep=';', index_col='referer', encoding="utf-8") 

bagOfWords = pd.io.parsers.read_csv('bagOfWords.csv', sep=';', header=0, names=["id","words","count"], encoding="utf-8") 
a = set(bagOfWords['words']) 
websitesAlchData['keywordIds'] = "[]" 
for i in websitesAlchData.index 
    keywords = websitesAlchData.loc[i,'keywords'] 
    try: 
     keywordsSet = set([ s.lower() for s in keywords.split(",") ]) 
    except: 
     keywordsSet = set() 
    existingWords = a & keywordsSet 
    lista = [] 
    for i in bagOfWords.index: 
     if bagOfWords.loc[i,'words'] in existingWords: 
      lista.append(bagOfWords.loc[i,'id']) 

    websitesAlchData.loc[i,'keywordIds'] = str(lista) 
    print(str(lista)) 
    print(websitesAlchData.loc[i,'keywordIds']) 
websitesAlchData.reset_index(inplace=True) 
websitesAlchData.to_csv(path_or_buf = 'websitesAlchDataKeywordCode.csv', index=False, sep=";", encoding="utf-8") 

兩個打印在的結束for循環給excpected結果,但是當我嘗試打印整個數據框「websitesAlchData」列「 keywordIds「仍然是」[]「,因此它也位於生成的.csv中。

我的猜測是我創造了一個副本,但我不能在哪裏。

任何想法這裏有什麼不對或如何做同樣的事情diffrently? 謝謝!

UPDATE:

的websitesAlchData.cvs看起來像這樣

referer;category;keywords 
url;int;word0,word2,word3 
url;int;word1,word3 
... 

而且話CVC的袋子。

id;index;count 
0;word0;11 
1;word1;14 
2;word2;14 
3;word3;14 
... 

預計輸出

referer;category;keywords;keywordIds 
url;int;word0,word2,word3;[0,2,3] 
url;int;word1,word3;[1,3] 
+0

你能提供一個小例子你兩個CSV文件?而且你期望從這個小例子中得到輸出。這聽起來好像應該可以在1或2行中完成。 – TomAugspurger

+0

我添加了示例數據,1-2行確實不錯。 – Bear

+0

我只在python 2.7中測試過它,但是可能會有一些變量覆蓋/覆蓋涉及'我'繼續。你使用'i'作爲'for'循環的變量。 – acushner

回答

0

肯定有一些錯誤使用i兩個for循環。改變這一點,看看是否有幫助。

+0

這就是我,愚蠢的錯誤。 非常感謝您發現它。 – Bear

+0

沒有問題。這些「微小」的錯誤有時很難找到。 – acushner

0

我會嘗試這樣的事情。您需要在較大的數據集上分析性能。

In [146]: df1 
Out[146]: 
    referer category   keywords 
0  url  int word0,word2,word3 
1  url  int  word1,word3 

[2 rows x 3 columns] 

In [147]: df2 
Out[147]: 
     id count 
index   
word0 0  11 
word1 1  14 
word2 2  14 
word3 3  14 

[4 rows x 2 columns] 

keywords列拆分爲單詞列表。通常在DataFrame中存儲列表在性能方面是一個糟糕的主意,但這是目前最直接的方式。

In [148]: vals = df1.keywords.str.split(',') 

In [149]: vals 
Out[149]: 
0 [word0, word2, word3] 
1   [word1, word3] 
Name: keywords, dtype: object 

然後從df2應用查找到列表中的每個元素vals

In [151]: ids = vals.apply(lambda x: [df2.loc[y, 'id'] for y in x]) 

In [152]: ids 
Out[152]: 
0 [0, 2, 3] 
1  [1, 3] 
Name: keywords, dtype: object 

最後CONCAT:

In [154]: df = pd.concat([df1, ids], axis=1) 

In [155]: df 
Out[155]: 
    referer category   keywords keywords 
0  url  int word0,word2,word3 [0, 2, 3] 
1  url  int  word1,word3  [1, 3] 

[2 rows x 4 columns] 
+0

所以它最終成爲了3班輪。最慢的部分可能是vals.apply(lambda x:[df2.loc [y,'id'] for y] in x]),它本質上是一個雙重嵌套for循環。但是你想要確定這一點。 – TomAugspurger

+0

感謝這個almoast爲我工作,但我有一些特殊情況下,我需要處理,所以我會堅持我的笨重和可能很慢的代碼,因爲數據集正在處理不大,時間不是問題。 – Bear