2017-01-27 153 views
0

我有DF具有三列的数据帧(逆文档频率),如下所示:计算IDF上的熊猫数据帧

DocumentID Words    Region 
1    ['A','B','C']  ['Canada'] 
2    ['A','X','D']  ['India', 'USA', 'Canada'] 
3    ['B','C','X']  ['Canada'] 

我想要计算IDF对每个字中的“词”列即我想要生成一个输出,每个单词都有'A','B','C'等字样以及相应的IDF值。

+1

有几个有据可查,维护和使用NLP图书馆在那里。你可能已经安装了一对夫妇。说实话,为什么你这样使用'DataFrame'对我来说毫无意义。列表的DataFrames几乎总是一个迹象,你正在接近这个错误的方式。 –

回答

-1
list_words = [] 
list_regions = [] 

for words in df['Words']: 

    for word in words: 

     list_words.append(word) 

for regions in df['Region']: 

    for region in regions: 

     list_regions.append(region) 

IDF_words = pd.DataFrame([], columns=['words','IDF']) 
IDF_regions = pd.DataFrame([], columns=['regions','IDF']) 

IDF_words['words'] = sorted(set(list_words)) 
IDF_regions['regions'] = sorted(set(list_regions)) 

IDF_words['IDF'] = IDF_words['words'].map(lambda x: list_words.count(x)/float(len(list_words))) 
IDF_regions['IDF'] = IDF_regions['regions'].map(lambda x: list_regions.count(x)/float(len(list_regions))) 

希望它有助于兄弟!
如果它不请给予好评/马克答道:)
和平

+0

也许对OP:区域与idf [w]有什么关系? – gerowam

+0

@epattaro TypeError:难以置信的类型:'list' – ComplexData

+0

它在这里完美运行。你有没有改变那些可能导致这种情况的东西?重要的是要注意list.append(...)之前没有相同的值。 – epattaro

0

这里有一个略少特定版本。假设你想IDF标准1/DF定义,你可以通过在Words列的各“文件”迭代:

from collections import defaultdict 

# Assuming the Words column is represented as you presented it: 
words = [['A','B','C'], 
     ['A','X','D'], 
     ['B','C','X']] 

# to store intermediate counts: 
idf = defaultdict(float) 
for doc in words: 
    for w in doc: 
     idf[w] += 1 

# Compute IDF as 1/df : 
idf = {k:(1/v) for (k,v) in idf.items()} #<- {'A': 0.5, 'B': 0.5,'C': 0.5, 'D': 1.0, 'X': 0.5} 
vocab = idf.keys() # Note that the vocab is also accessible now.