2017-04-21 50 views
1

我有一个包含文章列表的熊猫数据框;出口,发布日期,链接等。此数据框中的一列是关键字列表。例如,在关键字列中,每个单元格包含一个像[drop,right,states,laws]这样的列表。计算数据框内的列表中的发生率

我的最终目标是统计每天每个独特单词的出现次数。我遇到的挑战是将关键字从列表中分离出来,然后将它们与其发生的日期进行匹配。 ......假设这是最合乎逻辑的第一步。

目前我在下面的代码中有一个解决方案,但我是新来的python和想通过这些事情,我仍然认为在Excel的心态。下面的代码有效,但速度很慢。有没有快速的方法来做到这一点?

# Create a list of the keywords for articles in the last 30 days to determine their quantity 
keyword_list = stories_full_recent_df['Keywords'].tolist() 
keyword_list = [item for sublist in keyword_list for item in sublist] 

# Create a blank dataframe and new iterator to write the keyword appearances to 
wordtrends_df = pd.DataFrame(columns=['Captured_Date', 'Brand' , 'Coverage' ,'Keyword']) 
r = 0 

print("Creating table on keywords: {:,}".format(len(keyword_list))) 
print(time.strftime("%H:%M:%S")) 
# Write the keywords out into their own rows with the dates and origins in which they occur 
while r <= len(keyword_list): 
    for i in stories_full_recent_df.index: 
     words = stories_full_recent_df.loc[i]['Keywords'] 
     for word in words: 
      wordtrends_df.loc[r] = [stories_full_recent_df.loc[i]['Captured_Date'], stories_full_recent_df.loc[i]['Brand'], 
            stories_full_recent_df.loc[i]['Coverage'], word] 
     r += 1 

print(time.strftime("%H:%M:%S")) 
print("Keyword compilation complete.") 

一旦我有我只是使用.groupby在它自己的行中的每个字(),以每天找出出现次数的数量。

# Group and count the keywords and days to find the day with the least of each word 
test_min = wordtrends_df.groupby(('Keyword', 'Captured_Date'), as_index=False).count().sort_values(by=['Keyword','Brand'], ascending=True) 
keyword_min = test_min.groupby(['Keyword'], as_index=False).first() 

目前在这个列表中大约有100,000个单词,并且需要一个小时才能完成该列表。我很乐意以更快的方式做到这一点。

回答

0

我认为你可以这样做,得到预期的结果:

wordtrends_df = pd.melt(pd.concat((stories_full_recent_df[['Brand', 'Captured_Date', 'Coverage']], 
            stories_full_recent_df.Keywords.apply(pd.Series)),axis=1), 
         id_vars=['Brand','Captured_Date','Coverage'],value_name='Keyword')\ 
        .drop(['variable'],axis=1).dropna(subset=['Keyword']) 

下面一个小例子的说明。

考虑这样一个例子数据框:

df = pd.DataFrame({'Brand': ['X', 'Y'], 
'Captured_Date': ['2017-04-01', '2017-04-02'], 
'Coverage': [10, 20], 
'Keywords': [['a', 'b', 'c'], ['c', 'd']]}) 
# Brand Captured_Date Coverage Keywords 
# 0  X 2017-04-01  10 [a, b, c] 
# 1  Y 2017-04-02  20  [c, d] 

你可以做的第一件事情就是扩大关键字列,以便每个关键字占据自己的列:

a = df.Keywords.apply(pd.Series) 
# 0 1 2 
# 0 a b c 
# 1 c d NaN 

串连这与原来的DF没有关键词列:

b = pd.concat((df[['Captured_Date','Brand','Coverage']],a),axis=1) 
# Captured_Date Brand Coverage 0 1 2 
# 0 2017-04-01  X  10 a b c 
# 1 2017-04-02  Y  20 c d NaN 

融化这最后的结果来创建一个行pe [R关键字:

c = pd.melt(b,id_vars=['Captured_Date','Brand','Coverage'],value_name='Keyword') 
# Captured_Date Brand Coverage variable Keyword 
# 0 2017-04-01  X  10  0  a 
# 1 2017-04-02  Y  20  0  c 
# 2 2017-04-01  X  10  1  b 
# 3 2017-04-02  Y  20  1  d 
# 4 2017-04-01  X  10  2  c 
# 5 2017-04-02  Y  20  2  NaN 

最后,删除无用variable列拖放行,其中Keyword丢失:

d = c.drop(['variable'],axis=1).dropna(subset=['Keyword']) 
# Captured_Date Brand Coverage Keyword 
# 0 2017-04-01  X  10  a 
# 1 2017-04-02  Y  20  c 
# 2 2017-04-01  X  10  b 
# 3 2017-04-02  Y  20  d 
# 4 2017-04-01  X  10  c 

现在,您可以通过关键字和日期来计算。

+0

这工作完美,速度非常快。谢谢您的帮助。融化对这个新手来说是一个新手。 – bengen343