2017-04-21 21 views
1

私は記事のリストを含むパンダデータフレームを持っています。このデータフレーム内の列の1つは、キーワードのリストである。たとえば、キーワード列には、各セルに[ドロップ、右、状態、法則]のようなリストが含まれています。データフレーム内のリスト内での出現回数の計算

私の最終的な目標は、毎日の各ユニークワードの出現回数を数えることです。私が抱えている課題は、キーワードをリストから外して、それが発生した日付に合わせることです。 ...これが最も論理的な第一歩でもあると仮定します。

現在、私は以下のコードで解決策を示していますが、私は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() 

現在、このリストには約10万語があり、そのリストを実行するには1時間ほどかかります。私はそれを行うより速い方法についての考えが大好きです。

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']) 

以下の小さな例で説明:

答えて

0

は、私はあなたがこれを行うことによって、期待される結果を得ることができると思います。

は、例えば、データフレームを考えてみましょう:

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

連結し、この元DFにキーワードなし:あなたが行うことができます

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] 

まず最初は、各キーワードは独自の列を占めるようにキーワード列を拡張であります列:

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

関連する問題