我有一个名为keys的有序Pandas 数据帧,其中包含列group_1group_2、...、group_Nnumber.

我有第二个有序的Pandas 数据帧,名为fill_in,具有相同的列,但值不同.对于fill_in中的每一行,我希望找到keys中具有1)相同的group个值和2)number中小于fil_in的当前number的最大值的对应行的索引.如果在keys中找不到A fill_in的组,则它应该输出np.nan.如果number中的值低于keys的组中的任何值,它也应该输出np.nan.

以玩具为例,考虑以下keysfill_in和预期输出:

keys = pd.DataFrame({'group1':[1, 1, 1, 1, 2, 2],
                     'group2':[5, 5, 5, 7, 9, 9],
                     'number': [19,35,61,5, 105,300]})
fill_in = pd.DataFrame({'group1':[1, 1, 2, 5],
                     'group2':[5, 5, 9, 9],
                     'number': [0,43.2,900.3,14]})
expected_output = [np.nan, 1, 5, np.nan] 

我已经解决了这个问题,我捏了捏鼻子,在Pandas 数据帧上写了一个for循环.毫不奇怪,我的解决方案非常慢.有没有办法通过Pandas 手术来解决这个问题?

推荐答案

您想要Merge_asof:

# make sure value columns are of the same type
keys['number'] = keys['number'].astype(float)

# output column is `index_y`:
pd.merge_asof(fill_in.sort_values('number').reset_index(),
              keys.sort_values('number').reset_index(),
              by=['group1','group2'], on='number',
             ).sort_values(['index_x'])

输出:

   index_x  group1  group2  number  index_y
0        0       1       5     0.0      NaN
2        1       1       5    43.2      1.0
3        2       2       9   900.3      5.0
1        3       5       9    14.0      NaN

Python相关问答推荐

获取2个字节之间的异或

调试回归无法解决我的问题

使用Python C API重新启动Python解释器

仅对matplotlib的条标签中的一个条标签应用不同的格式

pyramid 内部数组中的连续序列-两极

PyQt5如何将pyuic 5生成的Python类添加到QStackedWidget中?

code _tkinter. Tcl错误:窗口路径名称错误.!按钮4"

从管道将Python应用程序部署到Azure Web应用程序,不包括需求包

从webhook中的短代码(而不是电话号码)接收Twilio消息

使用SciPy进行曲线匹配未能给出正确的匹配

对某些列的总数进行民意调查,但不单独列出每列

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

如何找到满足各组口罩条件的第一行?

多处理队列在与Forking http.server一起使用时随机跳过项目

如何从列表框中 Select 而不出错?

numpy.unique如何消除重复列?

Flask Jinja2如果语句总是计算为false&

(Python/Pandas)基于列中非缺失值的子集DataFrame

导入错误:无法导入名称';操作';

pysnmp—lextudio使用next()和getCmd()生成器导致TypeError:tuple对象不是迭代器''