这似乎是一种奇怪而反直觉的行为。任何人都可以解释为什么这样设计?
lkup = pd.Series({'fred':'Fred','amy':'Amy'})
for n in lkup:
print(n,' --> ',n in lkup)
>>>
Amy --> False
Fred --> False
为什么它给我值而不是键?
'fred' in lkup, 'amy' in lkup
>>>> True, True
我问的原因是,这实际上是在将数据帧中的值映射到系列中的值时弄乱了我的程序
df = pd.DataFrame([['fred',1,2,3],['amy',3,4,5],['john',5,6,7],['Fred',11,12,33]], columns=['name','c1','c2','c3'])
df
>>>
name c1 c2 c3
0 fred 1 2 3
1 amy 3 4 5
2 john 5 6 7
3 Fred 11 12 33
df.name.map(lkup)
>>>
0 Fred
1 Amy
2 NaN
3 NaN
很好 - 正如预期的那样:
lkup.to_dict()
>>> {'amy': 'Amy', 'fred': 'Fred'}
但是当我做的时候
df[df.name.isin('lkup')].name
>>> 3 Fred
使用DataFrames我没有这个问题。
for n in df:
print(n,' --> ',n in df)
>>>
name --> True
c1 --> True
c2 --> True
c3 --> True
这种矛盾逻辑的原因是什么?
答案 0 :(得分:0)
为什么它给我的是值而不是键?
因为它被编程为使in运算符迭代值,用于显示目的,因为你的键被认为是系列索引。
我问的原因是,这实际上是在将数据帧中的值映射到系列中的值时弄乱了我的程序
您的映射关闭有两个原因,第一个原因是密钥区分大小写,因此' fred'映射到 - > ' Fred',但' Fred' - > NAN因为系列中没有索引。 第二个,map在整个df上运行,所以如果你使用诸如' john'之类的密钥。系列中缺少的,映射将是NAN。
但是当我做的时候
DF [df.name.isin(' lkup&#39)]。名称
3弗雷德
Pandas数据框的功能与运营商中的python有很大不同。 它构建一个具有匹配值的矩阵。 由于你的价值观是从系列中收集的,所以他们是弗雷德'和艾米'因为迭代器返回的是值,而不是系列的索引。
来源: http://pandas.pydata.org/pandas-docs/stable/dsintro.html#series
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html#pandas.DataFrame
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.isin.html