2017-02-15 6 views
0

最後に、よりクリアな説明を参照してください。pandas.DataFrame:外部引数でapplymap()を適用する方法

http://pandas.pydata.org/pandas-docs/version/0.18.1/generated/pandas.DataFrame.apply.htmlによると、あなたは適用関数に外部の引数を渡すことができますが、同じことがapplymapの真実ではないです:http://pandas.pydata.org/pandas-docs/version/0.18.1/generated/pandas.DataFrame.applymap.html#pandas.DataFrame.applymap

私はaが要素で要素ごとの機能f(a, i)を、適用したい、とiです手動で入力した引数。私がそれを必要とする理由は、df.applymap(f)をループに入れてfor i in some_listするからです。

私が欲しいものの例を挙げれば、私はDataFrame dfがあり、各要素はnumpy.ndarrayです。私は各ndarrayi番目の要素を抽出し、それらから新しいDataFrameを形成したいと思います。だから、私はfを定義します。

def f(a, i): 
    return a[i] 

私はdfに含まれるnp.ndarrayのそれぞれのi番目の要素を返すでしょうループさせることができるように:各反復におけるよう

for i in some_series: 
    b[i] = df.applymap(f, i=i) 

を、私の値がiで、関数fに渡されます。

マルチインデックスをdfに使用していれば、もっと楽になりましたが、今のところこれが私の作業です。パンダの中で私がしたいことをする方法はありますか?私は理想的には、dfのすべての列のfor-loopingを避けたいと思っています。なぜapplymapがキーワード引数を取らないのかわかりません。applyはそうです。

また

、代わりに含まれる各ndarrayi番目の要素の私はそれが私に、各行/列のi番目の要素を与えるdf.applyを使用する場合、私は現在、(私は間違っている可能性がある)ことを理解する方法、 df


UPDATE:

だから私はちょうど私がシリーズにdfを分割して、私がやりたいことができpd.Series.applyを使用することができます実現。

def f(a,i): 
    return a[i] 

b = pd.Series(index=range(10), dtype=object) 
for i in b.index: 
    b[i] = np.random.rand(5) 

b.apply(f,args=(1,)) 

まさに私が期待していることを実行したいと思いますか。しかし、データフレームと試みる:

b = pd.DataFrame(index=range(4), columns=range(4), dtype=object) 
for i in b.index: 
    for col in b.columns: 
     b.loc[i,col] = np.random.rand(10) 

b.apply(f,args=(1,)) 

は私にValueError: Shape of passed values is (4, 10), indices imply (4, 4)を与えます。

答えて

0

パンダapplymapは、引数を受け付けません。DataFrame.applymap(func)iを状態として維持したい場合は、funcによってアクセス/変更されるグローバル変数として格納するか、decoratorを使用します。

ただし、applyメソッドをお試しください。

+0

私はつもりは、私の記事を更新してくれ秒を与えるんです。 –

+0

アップデートを参照してください。 apply関数を私が望むようにする方法はありますか?私はそれが私に与えているエラーを実際に理解していませんが(テキストがたくさんあります)、各要素の 'i'要素の代わりに' b'の 'i'番目の行を返そうとしていると仮定しました。 b。 –

+0

リストやシリーズ、または2Dデータフレームで 'f'を使用しますか? Pandas 'apply'は、DataFrameの入力軸に沿って関数を適用します。そして 'applymap'は、DataFrameの各シリーズに対してmap(func、series)を行うのと同じように、elementwiseを操作するDataFrameに関数を適用します。 –

0

あなたはそれを使用することができます。

def matchValue(value, dictionary): 
    return dictionary[value] 

a = {'first': 1, 'second': 2} 
b = {'first': 10, 'second': 20} 
df['column'] = df['column'].map(lambda x: matchValue(x, a)) 
関連する問題