从pandas DataFrame中查找多个值

时间:2015-08-02 07:57:31

标签: pandas

我一直在努力寻找一种从pandas DataFrame中查找多个值的优雅方式。假设我们有一个数据框df,其中包含“结果”R,这取决于多个索引键,我们还有另一个数据帧keys,其中每一行都是要查找的值列表来自df。问题是循环键并从df查找相应的值。如果df中不存在该值,我希望获得np.nan

到目前为止,我已经提出了三种不同的方法,但我觉得它们都缺乏优雅。所以我的问题是有多个更好的查找方法吗?请注意,以下三种方法都会产生相同的结果。

import pandas as pd
import numpy as np

df = pd.DataFrame({'A':range(5),
                   'B':range(10,15),
                   'C':range(100,105),
                   'R':np.random.rand(5)}).set_index(['A','B','C'])

print 'df'
print df

keys = pd.DataFrame({'A':[0,0,5],'B':[10,10,10],'C':[100,100,100]})
print '--'
print 'keys'
print keys

# By merge 
print '--'
print pd.merge(df.reset_index(), keys, on=['A','B','C'],how='right').reset_index().R

# By reindex
print '--'
print df.reindex(keys.set_index(['A','B','C']).index).reset_index().R

# By apply
print '--'
print keys.apply(lambda s : df.R.get((s.A,s.B,s.C)),axis=1).to_frame('R').R

2 个答案:

答案 0 :(得分:1)

我认为update很漂亮。

result = keys.set_index( ['A','B','C']) # looks like R
result['R'] = pd.np.nan # add nan

他们使用update

result.update(df)
                 R
A B  C            
0 10 100  0.068085
     100  0.068085
5 10 100       NaN

答案 1 :(得分:0)

我找到了一个更简单的解决方案:

keys = (pd.DataFrame({'A':[0,0,5],'B':[10,10,10],'C':[100,100,100]})
        .set_index(['A','B','C']))
keys['R'] = df

或类似(和更多链接兼容):

keys.assign(R = df)

这就是所需要的一切。索引的自动对齐完成剩下的工作! : - )