python - 子集 pandas 数据帧以根据另一个数据帧中的值获取特定行数

标签 python pandas dataframe

我有一个 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]组合的记录计数。

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、日期 2023-09-02 和小时 8 匹配的第一个数据框中获取 4586 记录。

我尝试在第二个数据帧上使用 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

最佳答案

您可以将df2中的count合并到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 - 子集 pandas 数据帧以根据另一个数据帧中的值获取特定行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77075446/

相关文章:

Python - 我可以在不打开文件的情况下将 UTF8 BOM 添加到文件吗?

python - 使用 readlines() 打印时出现 IndexError

python - 如何在 Pandas 的列中删除不包含字符串类型的行?

python - 使用 groupby 进行字数统计然后使用 python 循环时出现问题

python - 将 dict 的 dict 列表转换为 DataFrame

Python:继承内置列表类型VS过滤器、map内置函数

python - Keras pad_sequences 为基数为 10 的 int () 抛出无效文字

python - 在数据框中应用函数缓慢

python - 按特定列分组,列出其他列 Pandas

python - 将数据帧作为压缩的 csv 直接上传到 s3,而不将其保存在本地计算机上