2014-03-03 6 views
1

저는 python 및 pandas를 처음 사용하고 있으며 csv 데이터 파일을 조작하려고합니다. 두 개의 데이터 프레임을로드하고 하나는 키워드가있는 열을 포함하고 다른 하나는 "id"및 "word"열이있는 "bagOfWords"입니다. 내가 뭘 해야하는지 "[1,2,8,99 ...]"와 같이 "목록 문자열"에 키워드의 ID로 첫 번째 데이터 프레임에 열을 추가하는 것입니다. 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") 

함께 온 것입니다 루프의 끝의 두 개의 인쇄 I 전체 dataframe "websitesAlchData"열 "을 인쇄 할 때 excpected 결과를 제공하지만, keywordIds "는 여전히"[] "이므로 결과 .csv에도 있습니다.

내 생각 엔 내가 어딘가에 복사본을 만들지 만 내가 어디로 갈 수 없는지.

어떤 아이디어가 잘못 되었습니까? 또는 동일한 것을 다른 방법으로 수행하는 방법은 무엇입니까? 감사합니다.

는 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 
... 

예상 출력 모두 for 루프 i를 사용에 문제가 확실히있다

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

당신이 작은 예제를 제공 할 수 파일? 그리고 그 작은 예제에서 기대되는 결과입니다. 이것은 1 또는 2 라인에서 실행 가능해야하는 것처럼 들립니다. – TomAugspurger

+0

예제 데이터를 추가 했으므로 1-2 줄은 참 좋았을 것입니다. – Bear

+0

파이썬 2.7에서 테스트했을 뿐이지 만'i'와 관련된 변수 섀도 잉/덮어 쓰기가있을 수 있습니다. 'for' 루프의 변수로'i'를 사용합니다. – acushner

답변

0

. 그것을 변화시키고 도움이되는지 확인하십시오.

+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 열을 단어 목록으로 나눕니다. 일반적으로 DataFrames에 목록을 저장하는 것은 현명하지 못한 아이디어이지만, 지금은 가장 직접적인 방법입니다.

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

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

그런 다음 vals에서 목록의 각 요소에 df2에서 조회를 적용

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 : 두 개의 CSV있어의

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'] in y [x in]]'줄일 것이고, 이것은 본질적으로 이중으로 중첩 된 for 루프입니다. 그러나 당신은 그것을 측정하고 싶을 것입니다. – TomAugspurger

+0

감사합니다.이 almoast는 저에게 효과적이지만, 처리해야하는 몇 가지 특수한 경우가 있습니다. 따라서 데이터 세트가 크고 시간이 많이 걸리는 작업으로 시간이 많이 걸리고 코드가 느려질 수 있습니다. – Bear

관련 문제