python
1import pandas as pd 2df = pd.DataFrame({'word':['a', 'b', 'c', 'd'],'rank':[4,3,2,1]})
a, b, c, d
4,3,2,1
のようなpandasデータフレームのカラムがあるとして、
これをworkをrankの数だけ掛け算して
[a,a,a,a,b,b,b,c,c,d]
というようなリストを生成したいです。
どのようにしたらいいでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
解決済になっていますが、np.repeat()を用いたよりよい方法を紹介しておきます。
python
1>>> df = pd.DataFrame({'word': ['a', 'b', 'c', 'd'], 'rank': [4, 3, 2, 1]}) 2 3>>> df['word'].to_numpy().repeat(df['rank']).tolist() 4['a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd']
このほかにもいろいろな方法が考えられるので、速度の比較とともに紹介します。
python
1import benchit 2import pandas as pd 3 4# 4種類の方法を用意(すべて同じ結果を返す) 5def np_repeat(df): 6 return df['word'].to_numpy().repeat(df['rank'].to_numpy()).tolist() 7 8 9def str_to_list(df): 10 return list((df['word']*df['rank']).sum()) 11 12 13def df_explode(df): 14 return (df['word'].apply(list)*df['rank']).explode().tolist() 15 16 17def list_sum(df): 18 return (df['word'].apply(lambda x: [x])*df['rank']).sum() 19 20 21# 速度を比較 22df = pd.DataFrame({'word': ['a', 'b', 'c', 'd'], 'rank': [4, 3, 2, 1]}) 23funcs = [np_repeat, str_to_list, df_explode, list_sum] 24inputs = [df.sample(n, replace=True, random_state=0).reset_index(drop=True) 25 for n in 10 ** np.arange(6)] 26t = benchit.timings(funcs, inputs) 27 28# プロット(縦軸が処理にかかる時間、横軸がデータフレームの大きさ) 29t.plot(figsize=(8, 5), logx=True)
投稿2020/12/24 02:26
総合スコア1399
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/01 12:42
2021/01/05 04:33
0
ベストアンサー
普通に掛け算すればできます。
python
1>>> df = pd.DataFrame({'word':['a', 'b', 'c', 'd'], 'num':[4, 3, 2, 1]}) 2>>> df 3 word num 40 a 4 51 b 3 62 c 2 73 d 1 8>>> df['mult'] = df['word']*df['num'] 9>>> df 10 word num mult 110 a 4 aaaa 121 b 3 bbb 132 c 2 cc 143 d 1 d
質問が修正されたのですね。
['a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd']を出したければ掛け算したあとに合計して下さい。
python
1>>> inner_product = (df['word'].apply(lambda x: [x])*df['num']).sum() 2>>> print(inner_product) 3['a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd']
投稿2020/12/23 08:37
編集2020/12/23 11:05総合スコア24670
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/12/23 08:38
退会済みユーザー
2020/12/23 09:49
2020/12/23 10:03
退会済みユーザー
2020/12/23 10:40
退会済みユーザー
2020/12/23 10:42
2020/12/23 11:03
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。