[英]Map dataframe index using dictionary
Why doesn't df.index.map(dict)
work like df['column_name'].map(dict)
? 为什么
df.index.map(dict)
不能像df['column_name'].map(dict)
那样工作df.index.map(dict)
df['column_name'].map(dict)
?
Here's a little example of trying to use index.map: 这是尝试使用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)
This raises TypeError: 'dict' object is not callable
这引发了
TypeError: 'dict' object is not callable
Feeding it a lambda works: 喂它一个lambda工作:
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
'''
However, resetting the index and mapping on a column works as expected without complaint: 但是,重置索引和列上的映射可以按预期工作而无需投诉:
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
'''
I'm not answering your question... Just giving you a better work around. 我没有回答你的问题......只是给你一个更好的解决方法。
Use to_series()
them map
使用
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
Adding get
at the end 最后添加
get
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
An alternative workaround to calling map: 调用map的另一种解决方法:
df['two'] = pd.Series(map_dict)
df
one two
A 10 every
B 20 good
C 30 boy
D 40 does
E 50 fine
In any case, until the mapping issue gets resolved (per juanpa.arrivillaga's comment) you have to convert either the index or the dict-to-map to a pandas Series. 在任何情况下,直到映射问题得到解决(根据juanpa.arrivillaga的评论),你必须将索引或dict-to-map转换为pandas系列。
As of pandas version 0.23.x (released at May 15th, 2018) this problem is fixed: 截至pandas版本0.23.x(2018年5月15日发布),此问题已修复:
import pandas as pd
pd.__version__ # 0.23.4
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.index.map(map_dict)
# one
# every 10
# good 20
# boy 30
# does 40
# fine 50
From the What's New page for pandas 0.23.0 it says: 从Pandas 0.23.0的What's New页面中可以看出:
Index.map() can now accept Series and dictionary input objects (GH12756, GH18482, GH18509).
Index.map()现在可以接受系列和字典输入对象(GH12756,GH18482,GH18509)。
For more information, check the help page of Index.map 有关更多信息,请查看Index.map的帮助页面
map
(a python keyword) is apparently being used as a method of df.index
map
(一个python关键字)显然被用作df.index
的方法
Because this has its own internal demands, passing it an argument which has no __call__
method is not allowed. 因为它有自己的内部需求,所以不允许传递没有
__call__
方法的参数。
lambda
and functions are callable, a simple test: lambda
和函数是可调用的,一个简单的测试:
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__'
一个较短的替代方案 - 没有明确调用to_series
或pd.Series
:
df['two'] = df.rename(map_dict).index
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.