我一直在努力寻找一种从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
答案 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)
这就是所需要的一切。索引的自动对齐完成剩下的工作! : - )