我有一个Pandas 数据框,如下所示:

df1

  site_id       date hour  reach                                  maid
0    16002 2023-09-02   21    NaN  33f9fad6-20c5-426c-962f-bc2fbb82aecb
1    16002 2023-09-04   17    NaN  33f9fad6-20c5-426c-962f-bc2fbb82aecb
2    16002 2023-09-04   19    NaN  4a676aeb-6f6f-4622-934b-59b8f149aad7
3    16002 2023-09-04   17    NaN  35363191-c6aa-49fb-beb1-04a98898bed2
4    16002 2023-09-03   22    NaN  a44beb20-a90a-4135-be18-6dda71eeb7c2

我已经根据上面的数据帧创建了另一个数据帧,它提供了每[site_id,date,hour]个组合的记录计数.T

df2

      site_id       date hour  count
1666    37226 2023-09-02    8   4586
1676    37226 2023-09-03   16   3586
639     36972 2023-09-03   21   235
640     36972 2023-09-03   22   5431
641     36972 2023-09-03   23   343

我想筛选第一个数据帧,并获得第二个数据帧的count列中给出的确切记录数.例如,我想从与site_id 37226, date 2023-09-02 and hour 8匹配的第一个数据帧中获取4586条记录.

我try 在第二个数据帧上使用forloop,如下所示:

for index,rows in k3.iterrows():
    sid=rows['site_id']
    dt=rows['date']
    hr=rows['hour']
    cnt=rows['count']
    kdf1=dff[(dff['site_id'] == sid) & (dff['date']==dt) & (dff['hour']==hr)]   
    kdf2=kdf1[:cnt]

这很管用--但见效非常慢.有没有更快的方法来获得子集.我还附上两个样本数据帧的链接:

Link to df1 and df2

推荐答案

您可以将countdf2合并到df1,然后使用.groupby来减少组数:

cols = ["site_id", "date", "hour"]


df1 = df1.merge(df2, on=cols, how="right")
df1 = df1.groupby(cols, group_keys=False).apply(lambda x: x[: x["count"].iloc[0]])
df1.pop("count")

print(df1.head())

打印:

   site_id        date  hour  reach                                  maid
0    37221  2023-09-03    19    NaN  3e769e74-9129-49ba-838d-c36f3a9b3335
1    37221  2023-09-03    19    NaN  71e258d2-5155-4001-9b3c-02a1a1f9c9fb
2    37221  2023-09-03    19    NaN  92eaee88-b41c-4999-b1b8-6be183e5d2cf
3    37221  2023-09-03    19    NaN  c6eb504a-9259-410b-8391-7b06b3e92a41
4    37221  2023-09-03    19    NaN  c36400ff-0790-4844-b58b-2e4cdaafb4d9

注意:对于您的数据,此方法需要大约0.15秒,而您的原始版本需要大约11.2秒.

Python相关问答推荐

aiohTTP与pytest的奇怪行为

如何将 map 数组组合到pyspark中每列的单个 map 中

如何使用函数正确索引收件箱?

将从Python接收的原始字节图像数据转换为C++ Qt QIcon以显示在QStandardProject中

如何终止带有队列的Python进程?+ 队列大小的错误?

如何才能知道Python中2列表中的巧合.顺序很重要,但当1个失败时,其余的不应该失败或是0巧合

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

为什么符号没有按顺序添加?

将两只Pandas rame乘以指数

从numpy数组和参数创建收件箱

如何在Python数据框架中加速序列的符号化

基于索引值的Pandas DataFrame条件填充

在pandas中使用group_by,但有条件

未知依赖项pin—1阻止conda安装""

计算分布的标准差

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

将标签移动到matplotlib饼图中楔形块的开始处

跳过嵌套JSON中的级别并转换为Pandas Rame

在方法中设置属性值时,如何处理语句不可达[Unreacable]";的问题?

ModuleNotFoundError:没有模块名为x时try 运行我的代码''