2017-04-11 5 views
4

df.index.map(dict)がdf ['column_name']のように動作しないのはなぜですか?ここで辞書を使用してデータフレームインデックスをマップします。

はindex.map使用しようとしているのはほとんど例です:

import pandas as pd 

df = pd.DataFrame({'one': {'A': 10, 'B': 20, 'C': 30, 'D': 40, 'E': 50}}) 
map_dict = {'A': 'every', 'B': 'good', 'C': 'boy', 'D': 'does', 'E': 'fine'} 
df 
''' 
    one 
A 10 
B 20 
C 30 
D 40 
E 50 
''' 

df['two'] = df.index.map(mapper=map_dict) 

これは、ラムダが働くそれを餌TypeError: 'dict' object is not callable

を提起:

df['two'] = df.index.map(mapper=(lambda x: map_dict[x])); df 
''' 
    one two 
A 10 every 
B 20 good 
C 30 boy 
D 40 does 
E 50 fine 
''' 

しかし、インデックスとのマッピングをリセット列では苦情なしに期待どおりに機能します。

df.reset_index(inplace=True) 
df.rename(columns={'index': 'old_ndx'}, inplace=True) #so there's no index name confusion 
df['two'] = df.old_ndx.map(map_dict); df 

''' 
    old_ndx one two 
0  A 10 every 
1  B 20 good 
2  C 30 boy 
3  D 40 does 
4  E 50 fine 
''' 
map
+2

getの追加[ドキュメント](HTTP://pandas.pydata .org/pandas-docs/version/0.18.1/generated/pandas.Index.map.html)、 'pandas.Index.map'には呼び出し可能ファイルが必要です。あなたの質問は*なぜ*このデザインの決定でしたか? –

+2

[ここ](https://github.com/pandas-dev/pandas/issues/12756)は関連する問題です。それはちょうど亀裂を滑り落ちて、固定しようとしていないものだと思われます。それは[現在是正されている]ようです(https://github.com/pandas-dev/pandas/pull/15081)。 –

答えて

5

私はあなたの質問に答えていないよ:

lambdaと機能は、簡単なテスト呼び出し可能です。
使用to_series()それらmap

df = pd.DataFrame({'one': {'A': 10, 'B': 20, 'C': 30, 'D': 40, 'E': 50}}) 
map_dict = {'A': 'every', 'B': 'good', 'C': 'boy', 'D': 'does', 'E': 'fine'} 

df['two'] = df.index.to_series().map(map_dict) 

df 

    one two 
A 10 every 
B 20 good 
C 30 boy 
D 40 does 
E 50 fine 
0

(Pythonのキーワード)が明らかに

これはそれを許可されていない全く__call__方法を持っていない引数を渡し、それ自身の内部要求を有す​​るのでdf.indexの方法として使用されています。ただ、あなたの周りに、より良い仕事を与えて...

def foo(): 
    pass 
if foo.__call__: 
    print True 
# Prints True 

bar = lambda x: x+1 
if bar.__call__: 
    print True 
# Prints True 

print {'1':'one'}.__call__ 
# AttributeError: 'dict' object has no attribute '__call__' 
+1

'map'は"上書きされていません "。 'map'はメソッドではなく関数なので、オーバーライドするものはありません。 –

5

マップを呼び出す代わり回避策:あなたはどちらかを変換する必要がどのような場合には

df['two'] = pd.Series(map_dict) 

df 

    one two 
A 10 every 
B 20 good 
C 30 boy 
D 40 does 
E 50 fine 

、マッピングの問題が(juanpa.arrivillagaさんのコメントごとに)解決されるまで、またはdict-to-mapをpandasシリーズにマップします。

0

to_series又はpd.Seriesの明示的なコール--with短い代替:

df['two'] = df.rename(map_dict).index 
3

によれば、端

df['Two']=df.index.map(map_dict.get) 
df 
Out[155]: 
    one Two 
A 10 every 
B 20 good 
C 30 boy 
D 40 does 
E 50 fine 
関連する問題