2016-05-31 5 views
1

私はGraphlabを使用していますが、この質問はパンダにも当てはまると思います。PythonでSArrayの各要素の各値にどのように乗算するのですか?

import graphlab 
sf = graphlab.SFrame({'id': [1, 2, 3], 'user_score': [{"a":4, "b":3}, {"a":5, "b":7}, {"a":2, "b":3}], 'weight': [4, 5, 2]}) 

'user_score'の各要素の値に 'weight'の数値を掛けた新しい列を作成します。つまり、

sf = graphlab.SFrame({'id': [1, 2, 3], 'user_score': [{"a":4, "b":3}, {"a":5, "b":7}, {"a":2, "b":3}], 'weight': [4, 5, 2]}, 'new':[{"a":16, "b":12}, {"a":25, "b":35}, {"a":4, "b":6}]) 

私は以下の単純な関数を書こうとしたが、役に立たなかった。何かご意見は?

def trans(x, y): 
    d = dict() 
    for k, v in x.items(): 
     d[k] = v*y 
    return d 

sf.apply(trans(sf['user_score'], sf['weight'])) 

これは、次のエラーメッセージました:私はpandasデータフレームを使用していますが、それはまた、あなたのケースで動作するはず

AttributeError: 'SArray' object has no attribute 'items' 

答えて

0

これは微妙ですが、私はあなたが何をしたいと思いますが、このです:

sf.apply(lambda row: trans(row['user_score'], row['weight'])) 

適用する関数は、引数として関数を受け取り、その関数のパラメータとして各行を通過します。ご使用のバージョンでは、適用が呼び出される前にtrans関数を評価しています。その理由は、dictが必要なときにSArrayをtrans関数に渡すというエラーメッセージが表示される理由です。

1

を。

入力データフレーム:

df 
Out[34]: 
    id   user_score weight 
0 1 {u'a': 4, u'b': 3}  4 
1 2 {u'a': 5, u'b': 7}  5 
2 3 {u'a': 2, u'b': 3}  2 

出力:ここ

df 
Out[36]: 
    id   user_score weight     new 
0 1 {u'a': 4, u'b': 3}  4 {u'a': 16, u'b': 12} 
1 2 {u'a': 5, u'b': 7}  5 {u'a': 25, u'b': 35} 
2 3 {u'a': 2, u'b': 3}  2 {u'a': 4, u'b': 6} 
0

は、多くの可能なソリューションの1つです:

In [69]: df 
Out[69]: 
    id  user_score weight 
0 1 {'b': 3, 'a': 4}  4 
1 2 {'b': 7, 'a': 5}  5 
2 3 {'b': 3, 'a': 2}  2 

In [70]: df['user_score'] = df['user_score'].apply(lambda x: pd.Series(x)).mul(df.weight, axis=0).to_dict('record') 

In [71]: df 
Out[71]: 
    id   user_score weight 
0 1 {'b': 12, 'a': 16}  4 
1 2 {'b': 35, 'a': 25}  5 
2 3 {'b': 6, 'a': 4}  2 
+1

applyは、定義によってベクトル化されていないことを意味します。 – Jeff

+0

@Jeff、ご意見ありがとうございます!私は私の答えを修正しました – MaxU

+0

@ジェフ、私は間違っている場合は私を修正してくださいが、私は 'df ['num_column']のようなものと思う。apply(np.sum)' - 列全体(要素ごとではない) - または間違っていると理解していますか? – MaxU

関連する問題