2017-03-20 24 views
0

として列に複数の単語を使用しますPythonのパンダは、私は、次のパンダのデータフレームDFを持つインデックス

Book_Title_word | Revenue 
you     300 
I      300 
don't     200 
know     200 
what     200 
have     200 
done     200 
last     100 
summer    100 
loved     100 

私とあなたが両方のタイトルで、収益は彼らのために合計されたされた言葉なので:大文字と小文字はこれが最終目標であるDF2)

問題ではないはず。

これはPythonで実現可能ですか?収入を使用しているとき、私は、より大きな数字を使用していますので-ZA-zは、科学的表記fromat( '2.155051e-01')であるが提供する

非常UPDATE、ありがとうございました。

Book_Category | Book_Title      | Revenue | Quantity 
    A    ...what ...       3459283  45757 
    B    what ...        4376899  35657 
    C    .....what       4567856  7689 

df_new = pd.DataFrame(df['Book_Title'].str.split(' ').tolist(), index=df['Revenue']).stack().reset_index()[[0, 'Revenue']] 
df_new.columns = ['Book_Title_word', 'Revenue'] 
df_new.Book_Title_word = df_new.Book_Title_word.str.lower() 

df_new.groupby('Book_Title_word').sum().sort_values(by = 'Revenue',ascending = False) 

Book_Title_word | Revenue 
what     2.160651e-01 

これは私が(何らかの二次研究・ラムダ関数...に)これは、計算に最適であるかどうかわからないですこの答えFormat/Suppress Scientific Notation from Python Pandas Aggregation Results

答えて

1

これは片道です。各単語

df_new.groupby('Book_Title_word').sum().sort_values(by = 'Revenue',ascending = False) 


       Revenue 
Book_Title_word 
i    300 
you    300 
don't   200 
done   200 
have   200 
know   200 
what   200 
last   100 
loved   100 
summer   100 
+0

この回答に感謝します - それはうまくいきますが、収益のために得られる数値はこの形式です2.155051e-01-それを避ける方法はありますか?また、RevenueとQuantity_boughtのように2つのメトリックを追加したい場合は、 Quantity_boughtをインデックスに追加するだけですか? – jeangelj

+0

使用しているサンプルのスニペットを提供できますか?問題を理解するのが簡単です – Vaishali

+0

ありがとう - 私はデータの例を追加しました。私は収入と量を合計し、科学記法のフォーマットを避けたいと思います。 .format()を使用できますか? – jeangelj

1

から問題

pd.set_option('display.float_format', lambda x: '%.3f' % x) 

を固定したが、少なくともそれは十分に短いです:

new_df = pd.DataFrame({'Book_Title_word': pd.unique(np.concatenate(df.Book_Title.str.lower().str.split()))}) 
new_df['Revenue'] = new_df.Book_Title_word.apply(lambda x: df.loc[df.Book_Title.str.lower().str.contains(x), 'Revenue'].sum()) 

最初の行は新しいタイトル内のすべての単語を連結した1つの列のみを持つデータフレーム。小文字で、重複を削除する。 2番目の行は、これらの要素のすべてを通り、どの行にその単語が含まれているかを調べます(小文字にした後に)。そうであれば収益を得て、すべての結果を合計します。

EDIT:タイトルに*、+、かっこなどの正規表現の特殊文字が含まれていると、以下のコメントで私に気づかれました。したがって、正規表現は2行目:

new_df['Revenue'] = new_df.Book_Title_word.apply(lambda x: df.loc[df.Book_Title.str.lower().str.contains(x, regex=False), 'Revenue'].sum()) 
+0

当たりの総収入を見つけるために、GROUPBYを使っ今

df_new = pd.DataFrame(df['Book_Title'].str.split(' ').tolist(), index=df['Revenue']).stack().reset_index()[[0, 'Revenue']] df_new.columns = ['Book_Title_word', 'Revenue'] df_new.Book_Title_word = df_new.Book_Title_word.str.lower() 

新しいデータフレームを作成するために、単語の本のタイトルのコラムを分割どうもありがとうございました - 私は、次のようなエラー「のエラーを取得:何を繰り返します " – jeangelj

+0

提供されたdfで私はこのようなエラーはありません、多分あなたは別のデータを使用していますか?このスレッドを見て:http://stackoverflow.com/questions/28606617/pandas-python-regex-error-nothing-to-repeatこれは正規表現によって引き起こされる可能性があります、実際に私はエラーを複製することができます*または+ 1つのタイトル。 'str.contains(x)'の代わりに 'str.contains(x、regex = False)'を使ってみましょう。タイトルに*、+、かっこなどの特殊文字が含まれていると、一般的にそれらはうんざりする可能性があります)。 –

+0

ありがとうございました – jeangelj

関連する問題